ASP.NET MVC: пользовательские HTML-помощники в Razor
у меня возникли трудности с Html-помощниками при использовании с бритвой. Указанные помощники отлично работали в MVC 2 с движком просмотра веб-форм. Но не в бритве. Ошибка, которую я получаю во время выполнения:
Compiler Error Message: CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
Source Error:
Line 1: @using Wingspan.Web.Mvc;
Line 2: @Html.IncrementalMenu(MenuBlock.Site)
расширение вывода компилятора Show Detailed показывает:
d:...ViewsSharedMenuTop.cshtml(2,1): error CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
d:...ViewsSharedMenuTop.cshtml(2,7): error CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'
это указывает мне, что razor не нравится мой помощник, IncrementalMenu, возвращающий void (который отлично работает в MVC 2 web form engine views).
Я не получаю никаких ошибок во время компиляции, хотя строка кода (@Html.IncrementalMenu(...)) красным цветом подчеркнуто следующее сообщение:
Cannot implicitly convert type 'void' to 'object'
IncrementalMenu находится в размахе крыльев.Сеть.Пространство имен Mvc. Это подпись выглядит следующим образом:
public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
// Uses an HtmlTextWriter to render a menu from the sitemap
}
Я проклят, если я знаю, что это неправильно...
PS:
параметр MenuBlock-это просто перечисление, которое определяет, как должно отображаться меню. Не зацикливайтесь на этом, так как это нормально.
3 ответов:
вы можете позвонить своему помощнику так:
@{ Html.IncrementalMenu(MenuBlock.Site); }синтаксис WebForms
<% Html.IncrementalMenu(MenuBlock.Site); %>вы просто вызываете свой метод, и возвращаемое значение (если оно есть) игнорируется.
такой код ожидает возвращаемое значение и записывает возвращаемое значение в поток html:
@Html.YourHelper()синтаксис Webforms:
<%: Html.YourHelper() %>то же самое, если значение результата != IHtmlString:
<%= Server.HtmlEncode(Html.YourHelper()) %>
дополнение:
вы можете получить ту же или аналогичную ошибку с @Html.RenderPartial. В этом случае это связано с тем, что RenderPartial отображает непосредственно ответ, поэтому не является строкой и должен быть закодирован внутри "блока кода бритвы":
@{ Html.RenderPartial(...); }Я подозреваю, что это одна из причин, по которой Microsoft включила ASP.NET MVC новый Html.Частичный. Как Html.Partial возвращает строку, это нормально писать:
@Html.Partial, который выглядит намного лучше. Учитывая, что одна из заявленных целей Razor-быть легким на глаз, это вполне вероятно.
Он также заставляет меня, по крайней мере, чувствовать себя более комфортно. Я знаю, что такое возврат строки, я делаю это все время. Но "возвращение к ответу" требует еще нескольких циклов мозга каждый раз, когда я думаю об этом.
и это соответствует старой пословице, что, наконец, Microsoft получает свои продукты прямо в версии 3. Например, доступ 97.
что является удручающее сравнение. Потому что они все испортили в версии 4, т. е. Access 2000...
ваш помощник HTML должен возвращать MvcHtmlString, который представляет html для правильной работы с Razor (и другими движками представления, которые не являются WebFormsViewEngine)
public static MvcHtmlString Label(this HtmlHelper html, string expression) { return MvcHtmlString.Create("<label>" + expression + "</label>"); }
Comments