2011-12-29 79 views
22

IDI现在用的是下面的代码创建一个下拉列表:我可以更改由Html.DropDownListFor生成的html名称吗?

@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

回答

5

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

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

看起来像内部的代码来设置name属性AF调用ter添加所有其他HTML属性,并使用replaceExisting标志覆盖您设置的任何内容: 'tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute(“name”,fullName,true/* replaceExisting * /);' – core24 2011-12-30 16:56:18

+0

是的,我也注意到了。正如我在我的回答中提到的,可以通过这种方法更改ID,名称不能。你可能想改变你的问题,它在问题的文本中指定“ID”。 – Arbiter 2012-01-03 16:38:24

+10

@ core24实际上,您可以使用与id相同的方式更改name属性,但使用Name来代替名称。令人惊讶的是,它的工作。 – 2013-07-14 10:16:28

2

ID可以按@Arbiter所述进行更改。但是,如果您想更改名称,那么我认为您需要使用@Html.DropDownList而不是@Html.DropDownListFor。这会让您失去对属性元素进行强类型输入的好处,但仅仅更改ID意味着如果查看Request.Form响应,则无法以有意义的方式访问这些值,这对您来说可能是一种可接受的解决方法。

+0

我同意应该使用DropDownList而不是DropDownListFor。这对我来说很有帮助,因为我有一个包含字段数组的视图,它们都具有“Value”和“ID”属性。显然,我不希望所有的字段都有“价值”这个名称。相反,我希望每个输入元素都存储每个字段的值,但使用输入名称的唯一ID。在这种情况下,强制类型的自动绑定到模型字段会丢失,而我只是从发布的表单数据中读取唯一命名的值,并使用相应的id将其值分配给模型字段。 – Triynko 2015-11-16 20:38:02

+0

即使使用纯HTML,也可以使用DropDownList的另一个好处是可以在字段ID中使用点符号,例如“Images.AppBackground”,并且该点将自动替换为select的ID属性中的下划线,而不是名称属性。 – Triynko 2015-11-16 20:41:20

56

像@Anar在评论中说的;

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

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

我发现这只是添加一个属性“名称”,并没有设置属性“名称” – nuander 2014-04-30 17:32:57

+0

不按照描述的方式工作,至少在MVC4中没有。 @nuander报告的行为对我来说是一样的。 – 2014-07-17 08:54:33

+2

刚才检查,它适用于我很好,并在MVC4 – hmz 2014-08-06 12:08:04

3

有时HTML佣工不帮助。 DropDownListFor编码可以得到真正的复杂和快速的结束,它只是呈现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> 
0

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

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

我对这个问题的解决方案是用一个html助手扩展方法替换掉DropDownListFor()后的id和name。

 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"); 
1

只需使用“名称”而不是“名称”,它的工作原理。

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

对于那些不知道为什么,这并不工作,整个事情是大小写敏感的,需要在它前面的@ ...

所以,这个工程:

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

这不(介意小写的“否” @name

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

我觉得很荒谬,但至少它是有效的 – 2017-12-12 19:53:13

相关问题