ASP.NET MVC: пользовательские HTML-помощники в Razor - PullRequest
63 голосов
/ 18 ноября 2010

У меня проблемы с Html Helpers при использовании с Razor. Указанные помощники прекрасно работали в 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)

Расширение Показать подробный вывод компилятора показывает:

d:\...\Views\Shared\MenuTop.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:\...\Views\Shared\MenuTop.cshtml(2,7): error CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'

Это указывает на то, что бритве не нравится мой помощник, IncrementalMenu, возвращающий void (который отлично работает в представлениях движка веб-форм MVC 2).

Я не получаю ошибок во время компиляции, хотя строка кода (@ Html.IncrementalMenu (...)) подчеркнута красным со следующим сообщением:

Cannot implicitly convert type 'void' to 'object'

IncrementalMenu находится в пространстве имен Wingspan.Web.Mvc. Его подпись выглядит следующим образом:

public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
    // Uses an HtmlTextWriter to render a menu from the sitemap
}

Я взорван, если я знаю, что не так ...

PS:

Параметр MenuBlock - это просто перечисление, которое определяет, как должно отображаться меню. Не зацикливайтесь на этом, так как это нормально.

Ответы [ 3 ]

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

Вы можете вызвать своего помощника следующим образом:

@{ Html.IncrementalMenu(MenuBlock.Site); }

Синтаксис WebForms

<% Html.IncrementalMenu(MenuBlock.Site); %>

Вы просто вызываете свой метод, и возвращаемое значение (если оно есть) игнорируется.

Подобный код ожидает возвращаемое значение и записывает возвращаемое значение в поток html:

@Html.YourHelper()

Синтаксис Webforms:

<%: Html.YourHelper() %>

То же самое, если результатзначение! = IHtmlString:

<%= Server.HtmlEncode(Html.YourHelper()) %>
49 голосов
/ 09 февраля 2011

Приложение:

Вы можете получить такую ​​же или похожую ошибку с @ Html.RenderPartial.В этом случае это связано с тем, что RenderPartial отображает непосредственно в Response, поэтому не является строкой и должен быть закодирован внутри "блока кода Razor":

@{
   Html.RenderPartial(...);
}

Я подозреваю, что это один изпричины, по которым Microsoft включила в ASP.NET MVC новый Html.Partial.Так как Html.Partial возвращает строку, можно написать:

@Html.Partial

Что выглядит намного лучше.Учитывая, что одна из заявленных целей Razor - быть на виду, это вполне вероятно.

Это также заставляет меня, по крайней мере, чувствовать себя более комфортно.Я знаю, что такое возвращение строки, я делаю это все время.Но для «возврата к ответу» требуется каждый раз по несколько мозговых циклов каждый раз, когда я так думаю.

И это соответствует старой поговорке о том, что, наконец, Microsoft получила свои продукты в версии 3. EG, Access 97.

Что является удручающим сравнением.Потому что они испортили вещи в версии 4, то есть Access 2000 ...

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

Ваш HTML-помощник должен вернуть MvcHtmlString, который представляет html, для правильной работы с Razor (и другими механизмами представления, не являющимися WebFormsViewEngine)

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