ASP.NET MVC: пользовательские помощники HTML в бритве

StackOverflow https://stackoverflow.com/questions/4216736

Вопрос

Я испытываю трудности с HTML помощниками при использовании с бритвой. Указанные помощники работали нормально в MVC 2 с помощью Engine Web Form. Но не в бритве. Ошибка, которую я получаю во время выполнения:

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'

Это указывает на меня, что бритва не понравится мой помощник, инкременталменью, возвращая пустоту (которая отлично работает в видах двигателя MVC 2 Web).

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

Cannot implicitly convert type 'void' to 'object'

Инкременталменью находится в пространстве имен WingsPan.Web.mvc. Это подпись выглядит следующим образом:

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

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

PS:

Параметр MENUBLOCK - это просто enum, который идентифицирует, как меню должен рендер. Не зацикливайтесь на это, так как это нормально.

Это было полезно?

Решение

Вы можете позвонить вашему помощнику, как это:

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

Синтаксис WebForms

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

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

Таким образом, код ожидает возвращаемого значения и записывает возвращаемое значение в поток HTML:

@Html.YourHelper()

Синтаксис WebForms:

<%: Html.YourHelper() %>

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

<%= Server.HtmlEncode(Html.YourHelper()) %>

Другие советы

Дополнение:

Вы можете получить то же самое или подобное, ошибка с @ html.renderpartial. В этом случае это связано с тем, что рендерепарбарные рендурируют непосредственно на ответ, поэтому не является строкой и должна быть закодирована внутри «блока кода бритва»:

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

Я подозреваю, что это одна из причин, по которой Microsoft включила в ASP.NET MVC новый HTML.Partial. Как HTML.Partial возвращает строку, все в порядке, чтобы написать:

@Html.Partial

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

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

И это подходит с старой поговоркой, которая, наконец, Microsoft получает свою продукцию прямо в версии 3. Например, доступ 97.

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

Ваш HTML Helper должен вернуть MVCHTMLSTRING, который представляет HTML, чтобы правильно работать с бритвой (и другими моментами просмотра двигателей, которые не являются WebFormsViewEngine)

public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top