Dmy*_*iak 35 html asp.net-mvc html-helper radio-button asp.net-mvc-2
在使用这样的代码(EditorTemplates/UserType.ascx)时,默认的ASP.NET MVC2 Html助手似乎会生成重复的HTML ID:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<UserType>" %>
<%: Html.RadioButton("", UserType.Primary, Model == UserType.Primary) %>
<%: Html.RadioButton("", UserType.Standard, Model == UserType.Standard) %>
<%: Html.RadioButton("", UserType.ReadOnly, Model == UserType.ReadOnly) %>
Run Code Online (Sandbox Code Playgroud)
它产生的HTML是:
<input checked="checked" id="UserType" name="UserType" type="radio" value="Primary" />
<input id="UserType" name="UserType" type="radio" value="Standard" />
<input id="UserType" name="UserType" type="radio" value="ReadOnly" />
Run Code Online (Sandbox Code Playgroud)
这清楚地表明了一个问题.所以我一定是在滥用助手等等.
我可以手动指定id为html属性,但我无法保证它将是唯一的.
所以问题是如何确保RadioButton助手生成的ID对于每个值都是唯一的,并且仍然保留用于生成这些ID 的约定(因此嵌套模型是否受到尊重?(最好不要手动生成ID.)
Mat*_*els 16
除了PanJanek的答案:
如果你真的不需要元素有一个id,你也可以id=""在new { id="" }helpers 的htmlAttributes(ie )参数中指定.这将导致id属性在生成的html中完全省略.
来源:https://stackoverflow.com/a/2398670/210336
Pan*_*nek 12
我遇到了同样的问题.手动指定ID似乎是唯一的解决方案.如果您不需要任何ID(如javascript),但希望它只是唯一的,您可以为它们生成Guids:
<%: Html.RadioButton("", UserType.Primary, Model == UserType.Primary, new { id="radio" + Guid.NewGuid().ToString()}) %>
Run Code Online (Sandbox Code Playgroud)
更优雅的解决方案是创建自己的扩展方法HtmlHelper,将ID创建逻辑与视图分开.就像是:
public static class HtmlHelperExtensions
{
public static MvcHtmlString MyRadioButtonFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, bool value)
{
string myId = // generate id...
return htmlHelper.RadioButtonFor(expression, value, new {id=myId});
}
}
Run Code Online (Sandbox Code Playgroud)
辅助方法可以使用ViewContext和Model数据来创建更有意义的ID.
更新:
如果使用EditorTemplates像这样渲染控件
<%= Html.EditorFor(m=>m.User, "MyUserControl") %>
Run Code Online (Sandbox Code Playgroud)
然后在MyUserControl.ascx(放在〜/ Views/Shared/EditorTemplates中)中,您可以使用ViewData.TemplateInfo.HtmlFieldPrefixproperty来访问父控件ID或Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId("MyPostfixPart")生成带前缀的id.Theese方法可用于上面的辅助扩展.同样适用于使用Html.Editor(...)和呈现的控件Html.EditorForModel(...).在Html.Editor帮助程序中,您还可以根据需要手动指定htmlFiledName.
嵌入控件时
<%= Html.Partial("UserControl", Model.User) %>
Run Code Online (Sandbox Code Playgroud)
生成有意义的ID更难,因为Html.Partial不会提供有关前缀的信息 - ViewData.TemplateInfo.HtmlFieldPrefix它将始终为空.然后,唯一的解决方案是将前缀手动传递给ascx控件,作为模型字段的ViewData键,这不像前一个那样优雅.