ASP.NET MVC Helper扩展方法不将文本呈现为控件

时间:2009-06-17 02:47:15

标签: asp.net asp.net-mvc

尝试创建此Extension方法。除了帮助器呈现文本之外的工作,而不是页面呈现时对视图的控制:

我包括使用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();
}

视图中的输出看起来像这样(注意它不是渲染单选按钮而是将其视为文本):

*背景颜色 &lt;%= Html.RadioButton('rbBackgroundColorWhite',0,false)%&gt;白色 &lt;%= Html.RadioButton('rbBackgroundColorWhite',0)%&gt;黑色

3 个答案:

答案 0 :(得分:1)

我用Reflector做了一点点,我注意到Input字段的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.

以下几个案例陈述涵盖了各种输入类型所需的额外渲染。但你明白了。 MVC的人不是连接字符串;他们使用MergeAttribute(和其他)方法为他们做脏工作。我的猜测是那里也有一些浏览器兼容性。

我建议您可以使用TagBuilder类来构建HTML,就像MVC人员一样。

答案 1 :(得分:1)

原始代码的问题在于您输出&lt;%=%&gt; MVC期待文字html输出时的标签。换句话说,它不处理这些标签。

考虑将您的HTML放在.ASCX文件中并执行RenderPartial

答案 2 :(得分:1)

我知道这是一篇较旧的帖子,但是当我想要将Telerik MVC控件互相渲染时,我使用了一个优雅的解决方案。但是,它可以与任何HTML帮助程序一起使用。它涉及在cshtml(for razor)文件中创建内联帮助器,如下所示:

<!-- 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文件中创建了帮助器(对于razor),你可以获得控件的所有智能感知。