使用这样的代码(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) %>
它产生的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" />
这显然表明存在问题。所以我一定是在滥用助手等等。
我可以手动指定id
作为html属性,但我不能保证它是唯一的。
所以问题是如何确保RadioButton助手生成的ID对于每个值都是唯一的而仍然保留用于生成这些ID的约定(所以嵌套模型是否受到尊重?(最好不要手动生成ID。)
答案 0 :(得分:14)
除了PanJanek的回答:
如果您确实不需要元素具有id,则还可以在帮助程序的htmlAttributes(即id=""
)参数中指定new { id="" }
。这将导致id属性在生成的html中完全省略。
答案 1 :(得分:12)
我遇到了同样的问题。手动指定ID似乎是唯一的解决方案。如果您不需要任何内容(如javascript),但希望它只是唯一的,您可以为它们生成Guids:
<%: Html.RadioButton("", UserType.Primary, Model == UserType.Primary, new { id="radio" + Guid.NewGuid().ToString()}) %>
更优雅的解决方案是在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});
}
}
辅助方法可以使用ViewContext和Model数据创建更有意义的ID。
<强>更新强>
如果使用EditorTemplates像这样呈现控件
<%= Html.EditorFor(m=>m.User, "MyUserControl") %>
然后在MyUserControl.ascx(放在〜/ Views / Shared / EditorTemplates中)中,您可以使用ViewData.TemplateInfo.HtmlFieldPrefix
属性访问父控件ID或Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId("MyPostfixPart")
以生成带前缀的ID。 Theese方法可用于上面的辅助扩展。
同样适用于使用Html.Editor(...)
和Html.EditorForModel(...)
呈现的控件。在Html.Editor
帮助器中,如果需要,还可以手动指定htmlFiledName。
使用
嵌入控件时<%= Html.Partial("UserControl", Model.User) %>
生成有意义的ID更难,因为Html.Partial不会提供有关前缀的信息 - ViewData.TemplateInfo.HtmlFieldPrefix
将始终为空。然后,唯一的解决方案是将前缀手动传递给ascx控件作为模型字段的ViewData键,这不像前一个那样优雅。
答案 2 :(得分:0)
如果你确实需要通过jQuery访问单选按钮,我发现通常设置id的更好的地方将在页面上,接近他们的预期用途。这就是我做同样的事情:
@Html.Label(Resource.Question)
@Html.RadioButtonFor(m => m.Question, true, new {id = "QuestionYes"}) Yes
@Html.RadioButtonFor(m => m.Question, false, new {id = "QuestionNo"}) No
然后我的jQuery:
if ($("input[id='QuestionNo']").is(":checked")) {
$('#YesOptionalBlock').removeClass('showDiv');
$('#YesOptionalBlock').addClass('hideDiv');
}