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