尝试创建此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;黑色
答案 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),你可以获得控件的所有智能感知。