2009-06-17 43 views
1

试图创建此扩展方法。除了帮助程序正在呈现文本,而不是在页面呈现时对视图的控制之外的作品:ASP.NET MVC助手扩展方法不将文本呈现为控件

我包含使用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)%>黑色

+0

你是如何调用WriteTestControlToScreen的? – 2009-06-17 03:06:22

+0

<%= Html.WriteTestControlToScreen()%> – PositiveGuy 2009-06-17 03:18:20

回答

1

我做了一点乱抓周围反射,我注意到,对于输入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人一样。

+0

但最后,他们不是只是返回一个字符串?即返回tagBuilder.ToString(TagRenderMode.SelfClosing); – 2009-06-17 03:08:38

1

原始代码的问题在于,当MVC需要文字html输出时,您正在输出<%=%>标签。换句话说,它不处理这些标签。

请考虑将您的HTML放入.ASCX文件并执行RenderPartial

1

我知道这是一个较旧的帖子,但有一个优雅的解决方案,当我想要在另一个中呈现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(); 
} 

如下图所示的含量的方法,然后它可以被称为:

@{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文件(对于剃须刀)中创建了帮助程序,因此您可以获得控件的所有智能感知。