2010-11-11 10 views
13

Folks,Maszynka do golenia nie działa z łatwością przy użyciu silnie typowanego pliku Html.ActionLink?

staramy się używać silnie wpisane metod działania łącza, które wyglądają tak:

Html.ActionLink<HomeController> 

w widoku silnika maszynki.

Wiem, że nie powinniśmy ich używać przez cały czas, ponieważ ignoruje filtry itp., Ale faktem jest, że używamy ich.

Jeśli staram się to wykorzystać bezpośrednio w Razor tak:

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

otrzymuję błąd:

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

Jeśli spojrzeć na skompilowanego kodu, to dlatego Razor nie jest analizowanie to stwierdzenie, jak można się spodziewać. Skompilowany źródło, z błędem, który ma linię wygląda następująco:

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

wiele rzeczy pominięte dla zwięzłości :) Jak widać, to dzieli go na „<” Myślę, że interpretując to jako HTML tag, ale nie mogę być tego pewien.

Znalazłem obejście, ale jest brzydkie. Działa to:

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

Czy ktoś wie o lepszy sposób to zrobić?

Odpowiedz

18

Tak, aby użyć ogólnych metod, należy uciec od wyrażenia za pomocą parens. Czy ta praca:

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

Tak, to działa! Nadal nie jest idealny, ale lepszy niż bałagan, który miałem, dzięki :) – CubanX

+3

Niestety (dla tego scenariusza) Razor używa '<' jako znaku, który określa przejścia i nie jest możliwe wsparcie zarówno znaczników, jak i metody ogólnej w jednoznaczny sposób. – marcind

+0

Btw, 'null' w tym przykładzie jest zbędny, następująca działałaby równie dobrze' @ (Html.ActionLink (c => c.Edit(), "New")) ' –

0

Ten pracował dla mnie:

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

(Obie "@using" oświadczenia są obowiązkowe, w przeciwnym razie nie działa)

1

myślę, można również zrobić: @Html.ActionLink((FooController c) => c.Edit(null), "New")

Powiązane problemy