Ответ 1
Да, для использования общих методов вам нужно избежать выражения, используя parens. Будет ли это работать:
@(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"))
Люди,
Мы пытаемся использовать сильно типизированные методы ссылок на действия, которые выглядят следующим образом:
Html.ActionLink<HomeController>
в режиме просмотра Razor.
Я знаю, что мы не должны использовать их все время, потому что он игнорирует фильтры и т.д., но факт в том, что мы их используем.
Если я попытаюсь использовать это прямо в Razor, например:
@Html.ActionLink<HomeController>(c => c.Index, "Home")
Я получаю сообщение об ошибке:
CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
Если вы посмотрите на скомпилированный код, это потому, что Razor не анализирует этот оператор, как вы ожидали. Скомпилированный источник из ошибки, которая имеет строку, выглядит следующим образом:
...
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");
Многое опущено для краткости:) Как вы можете видеть, он разбивает его на "<" Я думаю, что это интерпретирует это как HTML-тег, но я не могу быть уверен.
Я нашел обходное решение, но это уродливо. Это работает:
@{Write(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"));}
Кто-нибудь знает, как лучше это сделать?
Да, для использования общих методов вам нужно избежать выражения, используя parens. Будет ли это работать:
@(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"))
Я думаю, вы также можете сделать:
@Html.ActionLink((FooController c) => c.Edit(null), "New")
Это работало для меня:
@using MyProjectNamespace.Controllers;
@using Microsoft.Web.Mvc; // MVC Futures
@{
ViewBag.Title = "Index";
}
<h1>Index</h1>
@(Html.ActionLink<FooController>(f => f.Index(), "Go (Strongly Typed)"))
(Оба оператора "@using" являются обязательными, иначе это не сработало)