单选按钮生成重复的HTML id-s

时间:2010-05-10 08:54:06

标签: html asp.net-mvc asp.net-mvc-2 radio-button html-helper

使用这样的代码(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。)

3 个答案:

答案 0 :(得分:14)

除了PanJanek的回答:
如果您确实不需要元素具有id,则还可以在帮助程序的htmlAttributes(即id="")参数中指定new { id="" }。这将导致id属性在生成的html中完全省略。

来源:https://stackoverflow.com/a/2398670/210336

答案 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');
}