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-это просто перечисление, которое определяет, как должно отображаться меню. Не зацикливайтесь на этом, так как это нормально.

559   3  

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

    Ничего не найдено.