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.


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

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


13

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

 @Html.EditorFor(expression, null, name)

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

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

4

Se llama Microsoft GOTCHA

Usa el nombre en mayúsculas, así

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

3

un poco "desagradable" =), prueba:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

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

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


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

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" }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.