ASP.NET MVC Helper Extension Метод не отображающий текст в качестве элемента управления - PullRequest
1 голос
/ 17 июня 2009

Пытался создать этот метод расширения. Работает за исключением того, что помощник отображает текст, а не элемент управления View, когда страница отображается:

Я включил с помощью System.Web.Mvc.Html; в верхней части моего вспомогательного класса, который содержит этот метод расширения, чтобы он понимал helper.RadioButton.

public static string WriteTestControlToScreen(this HtmlHelper helper)
{
    StringBuilder fields = new StringBuilder();
    fields.Append("<fieldset>");
    fields.Append("     <div class='formLabel'><span class='requiredText'>*</span><label>Background Color</label></div>");
    fields.Append("     <div class='formField'>" + helper.RadioButton("rbBackgroundColorWhite", 0, false) + "<label class='fieldInlineLabel' for=''>White</label></div>");
    fields.Append("     <div class='formField'>" + helper.RadioButton("rbBackgroundColorWhite", 0) + "<label class='fieldInlineLabel' for=''>Black</label></div>");
    fields.Append("</fieldset>");

    return fields.ToString();
}

Вывод в представлении выглядит следующим образом (обратите внимание, что это не рендеринг радиокнопки, а обработка его вместо текста):

* Цвет фона <% = Html.RadioButton ('rbBackgroundColorWhite', 0, false)%> Белый <% = Html.RadioButton ('rbBackgroundColorWhite', 0)%> черный

Ответы [ 3 ]

1 голос
/ 17 июня 2009

Проблема с вашим исходным кодом заключается в том, что вы выводите теги <% =%> в то время, когда MVC ожидает буквального вывода html. Другими словами, эти теги не обрабатываются.

Подумайте над тем, чтобы поместить свой HTML-файл в файл .ASCX и выполнить RenderPartial .

.
1 голос
/ 15 мая 2012

Я знаю, что это старый пост, но есть элегантное решение, которое я использовал, когда хочу визуализировать элементы управления Telerik MVC друг в друге. Однако его можно использовать с любыми HTML-помощниками. Он включает создание встроенного помощника в файле cshtml (для бритвы), как показано ниже:

<!-- This helper avoids nested literals with the sub-panel item -->
@helper RenderPositionalResponsibilities()
{
    Html.Telerik().PanelBar()
        .Name("ContactSubItem")
        .Items(subitem =>
        {
            subitem.Add()
                .Text("Positional Responsibilities")
                .Content(
                    @<text>
                        <div class="container scrollable" style="height: 150px;">
                            @Html.CheckboxFor(model => model.IsTrue)
                        </div>
                     </text>
                )
                .Expanded(true);
        })
        .Render();
}

Затем его можно вызвать, как показано в методе Content ниже:

@{Html.Telerik().PanelBar()
.Name("pnlUserForm")
.ClientEvents(e => e.OnExpand("pnlUserForm_OnExpand").OnCollapse("pnlUserForm_OnCollapse"))
.Items(i =>
{
    i.Add()
        .Text("User Information")
        .Expanded(true)
        .Content(
            @<text>
                <div>
                    @RenderPositionalResponsibilities()
                </div>
            </text>
         )
}
.Render();
}

Это может быть лучше для пользователей, желающих создать помощника для очень конкретной цели. Кроме того, поскольку вы создаете помощника в файле cshtml (для бритвы), вы получаете все значения intellisense для элементов управления.

1 голос
/ 17 июня 2009

Я немного покопался в Reflector и заметил, что все методы расширения MVC для полей ввода используют класс InputHelper, который, в свою очередь, использует класс TagBuilder:

private static string InputHelper(this HtmlHelper htmlHelper, InputType inputType, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes)
{
    ModelState state;
    if (string.IsNullOrEmpty(name))
    {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
    }
    TagBuilder builder = new TagBuilder("input");
    builder.MergeAttributes<string, object>(htmlAttributes);
    builder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));
    builder.MergeAttribute("name", name, true);
    string str = Convert.ToString(value, CultureInfo.CurrentCulture);
    bool flag = false;
    switch (inputType)
    {
        case InputType.CheckBox:

              //...etc.

Ниже приведены несколько операторов case, охватывающих дополнительный рендеринг, необходимый для различных типов ввода. Но вы поняли. Люди в MVC не объединяют строки; они используют методы MergeAttribute (и другие), чтобы сделать за них грязную работу. Я думаю, что в этом есть и кое-что хорошее для совместимости браузера.

Я предлагаю вам использовать класс TagBuilder для создания своего HTML, как это делают люди MVC.

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