2010-11-11 12 views
13

Folks,Il rasoio non funziona facilmente con Html.ActionLink fortemente tipizzato?

stiamo cercando di utilizzare i metodi di collegamento fortemente tipizzati azione che assomigliano a questo:

Html.ActionLink<HomeController> 

nel motore di visualizzazione Razor.

So che non dovremmo usarli tutto il tempo perché ignora i filtri, ecc., Ma il fatto è che li usiamo.

Se provo ad utilizzare questo direttamente a Razor in questo modo:

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

ho un errore di:

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

Se si guarda il codice compilato, è perché Razor non è l'analisi questa affermazione come ti aspetteresti. La sorgente compilato, dall'errore che ha la linea di simile a questa:

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

tanta roba omesse per brevità :) Come si può vedere, si divide sul "<" Penso che sia l'interpretazione che come HTML tag, ma non posso essere sicuro.

Ho trovato una soluzione, ma è brutto. Questo funziona:

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

Qualcuno sa di un modo migliore per farlo?

risposta

18

Sì, per utilizzare i metodi generici è necessario sfuggire all'espressione utilizzando Parens. Sarebbe questo lavoro:

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

Sì, funziona! Ancora non ideale, ma meglio del casino che ho avuto, grazie :) – CubanX

+3

Sfortunatamente (per questo scenario) Razor usa '<' come un personaggio che determina le transizioni e non è possibile supportare sia il markup che il metodo generico in modo univoco. – marcind

+0

Btw, il 'null' nell'esempio è ridondante, il seguente potrebbe funzionare allo stesso modo' @ (Html.ActionLink (c => c.Edit(), "Nuovo")) ' –

0

Questo ha funzionato per me:

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

(Entrambe le affermazioni "@using" sono obbligatori, altrimenti non ha funzionato)

1

penso che si può anche fare: @Html.ActionLink((FooController c) => c.Edit(null), "New")

Problemi correlati