我可以更改Html.DropDownListFor生成的html名称吗?

时间:2011-12-29 14:12:31

标签: asp.net-mvc asp.net-mvc-3

IDI正在使用以下代码创建下拉列表:

 @for (var index = 0; index < Model.AdminSummaries.Count(); index++) 
            { 
            <div class="rep_tr0"> 
                <div class="rep_td0"> 
                    @Html.DropDownListFor(x => Model.AdminSummaries[index].Status, AdminStatusReference.GetAdminStatusOptions()) 
                </div> 

代码创建以下内容:

<select id="AdminSummaries_2__Status" name="AdminSummaries[2].Status">
   <option value="1">Released</option>
   <option value="2">Review</option>
   <option value="3">New</option>
</select> 
<select id="AdminSummaries_3__Status" name="AdminSummaries[3].Status">
   <option value="1">Released</option>
   <option value="2">Review</option>
   <option value="3">New</option>
</select> 

我有什么方法可以更改它,以便创建“Status_2”,“Status_3”等 ID

9 个答案:

答案 0 :(得分:73)

就像@Anar在评论中说的那样;

  

实际上,您可以使用与id相同的方式更改name属性,但使用“Name”代替“name”。令人惊讶的是它有效。

 @Html.DropDownListFor(x => Model.AdminSummaries[index].Status, 
AdminStatusReference.GetAdminStatusOptions(), 
new { id = string.Format("Status_{0}",index ), Name = "GiveName" });

答案 1 :(得分:9)

有时,HTML助手无法提供帮助。 DropDownListForFor编码可以快速复杂化,最后它只是渲染HTML所以有时候去老学更好

<select name="myname" class="dropdownlist" id="myid">
    @foreach (SelectListItem item in Model.SomeSelectList) {
        if (item.Value ==  Model.theValue) {
            <option value="@(item.Value)" selected="selected">@item.Text</option>
        } else {
            <option value="@(item.Value)">@item.Text</option>
        }
    }
</select>

答案 2 :(得分:5)

您可以像设置任何HTML属性一样设置/更改ID(但不是我找到的名称)。

@Html.DropDownListFor(x => Model.AdminSummaries[index].Status, AdminStatusReference.GetAdminStatusOptions(), new { id = string.Format("Status_{0}",index ) });

答案 3 :(得分:5)

对于那些想知道为什么不起作用的人来说,整个事情都是区分大小写的,需要在它前面有一个@ ...

所以,这有效:

new { @id = "myID", @Name = "myName", @Value = "myValue", @class = "form-control", @onchange = "javascript:DoSomething(this.value);" }

这并不是(请注意@name中的小写&#39; n&#39;)

new { @id = "myID", @name = "myName", @Value = "myValue", @class = "form-control", @onchange = "javascript:DoSomething(this.value);" }

答案 4 :(得分:2)

可以按照@Arbiter的描述更改ID。但是,如果您想更改名称,那么我认为您需要使用@Html.DropDownList而不是@Html.DropDownListFor。这对于使用属性元素进行强类型操作会带来任何好处,但只是更改ID意味着如果查看Request.Form响应,您无法以有意义的方式访问值,这可能是一种可接受的解决方法你。

答案 5 :(得分:2)

只需使用&#34;姓名&#34;而不是&#34; name&#34;它有效。

@Html.DropDownList("ClassID", null, "Select Class", htmlAttributes: new { id = _id, Name =_id, @class = "form-control" })

答案 6 :(得分:1)

谢谢..它的工作......添加.Name更改html密码属性的名称

      @Html.PasswordFor(Function(model) model.password, New With {.Autocomplete = "off", .Name = "oldpassword", .id = "oldpassword", .value = Model.password, .readonly = True})

答案 7 :(得分:1)

您需要将DropDownListFor更改为DropDownList。比起您可以轻松更改名称。

@Html.DropDownList("YourName", SelectList, new { @id = "YourId", @class = "YourClass" })

希望它会起作用。

答案 8 :(得分:0)

我对此问题的解决方案是使用html帮助扩展方法替换DropDownListFor()之后的id和名称。

        public static MvcHtmlString ReplaceIdAndName(this MvcHtmlString htmlSource, string name)
    {
        MvcHtmlString result;
        if (name == null)
            result = htmlSource;
        else
        {
            string id = name.Replace("[", "_").Replace("]", "_").Replace(".", "_");  // HTML ids cannot have []. so MVC convention replaces with _
            XDocument html = XDocument.Parse(htmlSource.ToHtmlString());
            html.Elements().Select(e => e.Attribute("id")).FirstOrDefault().SetValue(id);
            html.Elements().Select(e => e.Attribute("name")).FirstOrDefault().SetValue(name);
            result = MvcHtmlString.Create(html.ToString());
        }
        return result;
    }


DropDownListFor(...).ReplaceIdAndName("myclass[1].myprop");