13 votes

Razor ne fonctionne pas facilement avec les Html.ActionLink ? fortement typés.

Les gens,

Nous essayons d'utiliser les méthodes de lien d'action fortement typées qui ressemblent à ceci :

Html.ActionLink<HomeController>

dans le moteur de vue Razor.

Je sais que nous ne devrions pas les utiliser tout le temps car ils ignorent les filtres, etc. mais le fait est que nous les utilisons.

Si j'essaie de l'utiliser directement dans Razor comme ceci :

@Html.ActionLink<HomeController>(c => c.Index, "Home")

Je reçois une erreur de :

CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments

Si vous regardez le code compilé, c'est parce que Razor n'analyse pas cette déclaration comme on pourrait s'y attendre. La source compilée, de l'erreur qui a la ligne ressemble à ceci :

...
Line 101:              #line 13 "C:\dev\TheNetwork\POC\Web\Views\Policy\Edit.cshtml"
Line 102:  Write(Html.ActionLink);
Line 103:  
Line 104:              
Line 105:              #line default
Line 106:              #line hidden
Line 107:  WriteLiteral("<PolicySectionController>(c => c.Edit(null), "New\")\r\n\r\n\r\n\r\n");

Beaucoup de choses ont été omises pour des raisons de brièveté :) Comme vous pouvez le voir, il le divise sur le "<" Je pense qu'il l'interprète comme une balise HTML, mais je ne suis pas sûr.

J'ai trouvé une solution de contournement, mais c'est moche. Cela fonctionne :

@{Write(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"));}

Quelqu'un connaît-il une meilleure façon de procéder ?

18voto

marcind Points 38002

Oui, pour utiliser les méthodes génériques, il faut échapper l'expression en utilisant des parens. Est-ce que ça marcherait :

@(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"))

1voto

mcintyre321 Points 5393

Je pense que vous pouvez aussi le faire : @Html.ActionLink((FooController c) => c.Edit(null), "New")

0voto

NahuelGQ Points 43

Ça a marché pour moi :

@using MyProjectNamespace.Controllers;
@using Microsoft.Web.Mvc; // MVC Futures
@{
    ViewBag.Title = "Index";
}
<h1>Index</h1>
@(Html.ActionLink<FooController>(f => f.Index(), "Go (Strongly Typed)"))

(Les deux déclarations "@using" sont obligatoires, sinon cela ne fonctionne pas).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X