tutorial que pages net mvc asp asp.net-mvc asp.net-mvc-4 razor-2

asp.net-mvc - que - razor pages tutorial



ASP.NET MVC 4 anula el nombre y la identificación html emitidos (3)

Necesita usar Html.Hidden (o escribir <input ...> a mano) en lugar de Html.HiddenFor

@Html.Hidden("some_property", Model.SomeProperty, new { @id = "some_property" })

El objetivo de los helpers fuertemente tipados (por ejemplo, el que termina con el nombre "For" como HiddenFor ) es adivinar el nombre de entrada para usted a partir de la expresión proporcionada. Por lo tanto, si desea tener un nombre de entrada "personalizado", siempre puede usar los ayudantes habituales como Html.Hidden donde puede establecer explícitamente el nombre.

La respuesta aceptada de unjuken es incorrecta porque genera HTML no válido .

El uso de esa solución genera DOS atributos de name :

<input Name="some_property" name="SomeProperty" id="some_property" type="hidden" value="test" />

Por lo tanto, tendrá Name="some_property" Y name="SomeProperty" que es HTML NO name="SomeProperty" porque una entrada solo puede tener UN atributo de name . (aunque la mayoría de los navegadores toman el primer Name="some_property" y no les importa el segundo ...)

Estoy intentando cambiar el nombre emitido de la entrada html creada por @Html.HiddenFor .

El código que estoy usando esto:

@Html.HiddenFor(e => e.SomeProperty, new { @id = "some_property", @name = "some_property" }

Ahora esto funciona para la id , sin embargo, no funciona para el nombre. Ahora realmente no me importa la id ahora, necesito el name para cambiar, porque esa es la que se publica en el servidor de destino.

Esta ahí

  • ¿Una propiedad que puedo aplicar en SomeProperty en mi modelo?
  • ¿Una forma en Html.HiddenFor de anular la propiedad del name ?

¿O estoy atascado para hacer un simple <input ...> a mano?


Si utiliza:

@ Html.HiddenFor (e => e.SomeProperty, nuevo {@id = "some_property", @Name = "some_property"});

Observe la "N" mayúscula en @Name. Funcionará


Tenía curiosidad sobre por qué no funcionaba el anular el nombre. A menos que lo capitalice (es decir, new {@Name = ''somename''} ), parece que no funciona. Como han señalado otros, esto solo funciona porque genera atributos de nombre duplicados y Chrome lo limpia.

Miré el último código fuente de MVC para descubrir qué está pasando. Considere el siguiente snipper del método GenerateInput en DefaultHtmlGenerator.cs :

var fullName = NameAndIdProvider.GetFullHtmlFieldName(viewContext, expression); if (string.IsNullOrEmpty(fullName)) { throw new ArgumentException( ... } var inputTypeString = GetInputTypeString(inputType); var tagBuilder = new TagBuilder("input"); tagBuilder.TagRenderMode = TagRenderMode.SelfClosing; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("type", inputTypeString); tagBuilder.MergeAttribute("name", fullName, replaceExisting: true);

Podemos ver aquí, el problema es que, independientemente de la propiedad de nombre que proporciones, será anulada por la última llamada a MergeAttribute , que usará cualquier lógica que sea que asigne a la variable fullName del método GetFullHtmlFieldName .

En cierto modo, entiendo por qué hacen cumplir este comportamiento, adivinando que tiene algo que ver con el control de los nombres utilizados en la devolución de datos para garantizar que funcione con la carpeta del modelo.

En cualquier caso, para que esto ocurra, digo simplemente construir manualmente el elemento de entrada y no usar el asistente de visión de la maquinilla de afeitar.