update tools packs net mvc language instalar asp asp.net-mvc asp.net-mvc-3

asp.net mvc - tools - ¿Puedo cambiar el nombre html generado por Html.DropDownListFor?



instalar asp net mvc (8)

IDI estoy utilizando el siguiente código para crear una lista desplegable:

@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>

El código crea lo siguiente:

<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>

¿Hay alguna forma en que pueda cambiarlo para que cree una ID de "Estado_2", "Estado_3", etc.


A veces los ayudantes de HTML no ayudan. DropDownListPara que la codificación se complique muy rápido y al final solo se muestra HTML, por lo que a veces es mejor ir a la vieja escuela

<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>


Como dijo @Anar en los comentarios;

En realidad, puede cambiar el atributo de nombre de la misma manera que id, pero en lugar de "nombre", use "Nombre". Sorprendentemente funciona.

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


Gracias ... funciona ... al agregar .Nombre, cambie el nombre del atributo de contraseña html

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


La identificación se puede cambiar según lo descrito por @Arbiter. Sin embargo, si desea cambiar el nombre, creo que necesita usar @Html.DropDownList lugar de @Html.DropDownListFor . Esto le hace perder los beneficios de tener una escritura fuerte para el elemento de propiedad, pero como solo cambiar las ID significa que no puede acceder a los valores de manera significativa si observa la respuesta Request.Form , esta puede ser una solución aceptable para usted.


Mi solución a este problema es reemplazar el ID y el nombre después de DropDownListFor () con un método de extensión html helper.

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


Para aquellos que se preguntan por qué esto no funciona, todo esto distingue entre mayúsculas y minúsculas y necesita una @ delante ...

así, esto funciona:

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

Y esto no ( @name la minúscula ''n'' en @name )

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


Puede establecer / cambiar la ID como cualquier atributo HTML (pero no el nombre que he encontrado).

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


Simplemente use "Nombre" en lugar de "nombre" y funciona.

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