Бритва не работает легко со строго типизированным Html.ActionLink? - PullRequest
13 голосов
/ 12 ноября 2010

Народ,

Мы пытаемся использовать строго типизированные методы ссылок действий, которые выглядят следующим образом:

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-тег, но я не уверен. </p>

Я нашел обходной путь, но он уродлив.Это работает:

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

Кто-нибудь знает лучший способ сделать это?

Ответы [ 3 ]

18 голосов
/ 12 ноября 2010

Да, чтобы использовать универсальные методы, вам нужно экранировать выражение, используя parens.Будет ли это работать:

@(Html.ActionLink<PolicySectionController>(c => c.Edit(null), "New"))
1 голос
/ 27 июня 2013

Я думаю, что вы также можете сделать: @Html.ActionLink((FooController c) => c.Edit(null), "New")

0 голосов
/ 01 июня 2011

Это сработало для меня:

@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" являются обязательными, в противном случае это не сработало)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...