2010-11-11 19 views
13

gente,Razor no funciona fácilmente con Html.ActionLink fuertemente tipado?

estamos tratando de utilizar los métodos de enlace de acción inflexible de tipos que se ven así:

Html.ActionLink<HomeController> 

en el motor de vista de afeitar.

Sé que no debemos usarlos todo el tiempo porque ignora los filtros, etc., pero el hecho es que los usamos.

Si trato de usar esta directamente en la maquinilla de afeitar de este modo:

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

me sale un error de:

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

Si nos fijamos en el código compilado, es porque la maquinilla de afeitar no está analizando esa declaración como era de esperar La fuente compilado, a partir del error que tiene la línea se ve así:

... 
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"); 

mucho material omitido por razones de brevedad :) Como se puede ver, se divide en el "<" Creo que es la interpretación que como un archivo HTML etiqueta, pero no puedo estar seguro.

Encontré una solución, pero es fea. Esto funciona:

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

¿Alguien sabe de una mejor manera de hacer esto?

Respuesta

18

Sí, para usar métodos genéricos, debe escapar de la expresión utilizando parens. Que este trabajo:

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

Sí, eso funciona! Todavía no es ideal, pero es mejor que el desastre que tuve, gracias :) – CubanX

+3

Desafortunadamente (para este escenario) Razor usa '<' como un personaje que determina las transiciones y no es posible admitir tanto el marcado como el método genérico de una manera inequívoca. – marcind

+0

Por cierto, el 'nulo' en el ejemplo es redundante, lo siguiente funcionaría igual de bien' @ (Html.ActionLink (c => c.Edit(), "Nuevo")) ' –

0

Esto funcionó para mí:

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

(Ambas declaraciones "@using" son obligatorios, de lo contrario no funcionaba)

1

creo que también se puede hacer: @Html.ActionLink((FooController c) => c.Edit(null), "New")

Cuestiones relacionadas