ASP.NET MVC 3: anule el atributo "nombre" con TextBoxFor

99

¿Es posible cuando se usa Html.TextBoxForpara anular el atributo de nombre?

Lo he intentado sin éxito. Necesito usar TextBoxFor para que la validación del lado del cliente funcione, sin embargo, por razones que no voy a entrar, necesito que el nombre del cuadro de texto sea diferente del generado.

He probado lo siguiente:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

Lo que funciona para ID pero no para nombre. es posible?

Actualización : buscando en el código de TextBoxFor. No parece que haya una manera fácil. Ojalá alguien pueda demostrar que estoy equivocado.

Rob Stevenson-Leggett
fuente
¿Cuál es el tipo de datos de 'Datos'
Archil
2
Esas preguntas están planteando algo ligeramente diferente. Además, este es el mayor de los tres, así que creo que te refieres a duplicado por.
Rob Stevenson-Leggett

Respuestas:

234

Rob, en realidad hay una forma mucho más sencilla. En lugar de nombre , use Nombre :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
anar khalilov
fuente
11
Es sensible a mayúsculas y minúsculas, es @highwingers, este pequeño detalle tiene el potencial de ahorrar horas.
anar khalilov
3
Overkill .. Nombre pero id X_X
Vladimirs
2
Extraño, "id" no distingue entre mayúsculas y minúsculas (funciona bien con Id e id) pero "name" no lo es.
Vladimirs
10
Con ASP.NET 4, proporcionar Nameresultados en dos atributos, Namey name, y el enlazador de modelos usa name.
GSerg
1
Pero manejar dos propiedades diferentes cuyos nombres difieren solo según el caso es una receta para una pesadilla de mantenimiento .....
James McCormack
41

¿Está preguntando esto porque desea aplicar un prefijo al nombre? Si es así, puede hacer esto configurando ViewData.TemplateInfo.HtmlFieldPrefixsu Controller.

Aprendí mucho sobre estas cosas en el blog de Brad Wilson .

James McCormack
fuente
¡Parece el ganador! Hermoso.
Rob Stevenson-Leggett
2
Sí, lo ocultaron muy bien, ¿no? :)
James McCormack
Esto me ahorró algunos dolores de cabeza y la duplicación de código.
davidXYZ
13

EditorFor tiene una sobrecarga en la que puede proporcionar el nameatributo como parámetro:

 @Html.EditorFor(expression, null, name)
Protector uno
fuente
1
Me habría ahorrado horas si hubiera encontrado esto hace horas, jaja
Johnie Karr
Interesante, pero no hay una sobrecarga para el atributo de nombre para ayudantes similares como DropDownListFor, debe especificarlo en el parámetro de atributos html (con una N mayúscula en el nombre).
nmit026
8

Prueba EditorFor . puede pasar una cadena como nombre de plantilla si desea asegurarse de que el cuadro de texto se represente incluso si el tipo de propiedad no es una cadena. Si la propiedad ya es una cadena, no es necesario representar templatenameexplícitamente el cuadro de texto, por lo que puede pasar null. Tenga en cuenta que no requiere el parámetro id explícitamente, lo inferirá del nombre del elemento. Y todas las cosas de validación siguen activas con EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")
Archil
fuente
7

La respuesta de Ben me consiguió lo que estaba buscando, excepto que debes ajustarlo en Html.Raw

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))
Rip Ryness
fuente
4

Se llama Microsoft GOTCHA

Usa el nombre en mayúsculas, así

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})
Ali Adravi
fuente
3

un poco "desagradable" =), prueba:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")
benwasd
fuente
Parece una manera fácil y agradable de hacerlo. Si es un poco hacky :-)
Rob Stevenson-Leggett
umm, de esta manera, en lugar wouldnt que acaba de tomar Html.TexBox normales .. ya que cualquier tipos estáticos se ha ido de todos modos después de la sustitución
johnny afilada
1

¡Para mí funciona! ¡Espero que te ayude!

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })
Jonas
fuente
1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

No estoy seguro de cuál de esos dos parámetros de cadena en el medio hace el trabajo, pero funcionó solo cuando los escribí.

Señor Ajdos
fuente
Es Id y Nombre. esto funcionó para mí. Revisé todas las respuestas anteriores y ninguna de ellas funcionó, pero esta 1. Gracias.
Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. No tengo idea de lo que templateNamese supone que es, así que usé null. Pues htmlFieldNameutilicé el nombre del parámetro (en mi caso, "ipmi" en lugar de "IPMI"). Eso funcionó para mí.
BCdotWEB
0

Para este ejemplo, estaba deshabilitando campos de formulario según los permisos, pero aún los mostraba. Tenía un campo oculto para enviar el valor al controlador, pero quería un nombre de campo diferente en EditorFor. El primer parámetro después del valor del modelo representa la propiedad "nombre", el segundo es el nuevo nombre.

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

Resultados en:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 
ScottLenart
fuente
0

Manténgalo simple, ya que está proporcionando la ID, simplemente debería poder usar el método "TextBox" en lugar de "TextBoxFor" y funcionará bien en el lado del cliente y en el lado del servidor. Además, aunque la respuesta aceptada funcionará, producirá atributos de nombre duplicados en su etiqueta si la inspecciona con un navegador. La siguiente solución no tiene ese problema.

MvcHtmlString Html.TextBox (nombre de cadena, valor de cadena, objeto htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
TroySteven
fuente