ASP.NET MVC 3: Substitua o atributo “name” por TextBoxFor

99

É possível ao usar Html.TextBoxForpara substituir o atributo de nome?

Eu tentei sem sucesso. Preciso usar TextBoxFor para fazer a validação do lado do cliente funcionar, no entanto, por motivos que não vou entrar em detalhes, preciso que o nome da caixa de texto seja diferente do gerado.

Eu tentei o seguinte:

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

Que funciona para ID, mas não para nome. Isso é possível?

Atualização : Olhando para o código de TextBoxFor. Não parece haver uma maneira fácil. Espero que alguém possa provar que estou errado.

Rob Stevenson-Leggett
fonte
Qual é o tipo de dados de 'Dados'
archil
2
Essas perguntas estão perguntando algo ligeiramente diferente. Além disso - este é o mais antigo dos três, então acho que você quer dizer duplicado por.
Rob Stevenson-Leggett de

Respostas:

234

Rob, na verdade existe uma maneira muito mais simples. Em vez de nome , use Nome :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
anar khalilov
fonte
11
Sensível a maiúsculas e minúsculas é @highwingers, este pequeno detalhe tem o potencial de economizar horas.
anar khalilov
3
Exagero .. Nome, mas id X_X
Vladimirs
2
Estranho, "id" não faz distinção entre maiúsculas e minúsculas (funciona bem com Id e id), mas "nome" não.
Vladimirs
10
Com a ASP.NET 4, fornecer Nameresultados em dois atributos, Namee name, e o fichário de modelo usa o name.
GSerg
1
Mas lidar com duas propriedades diferentes cujos nomes diferem apenas por caso é uma receita para um pesadelo de manutenção ...
James McCormack
41

Você está perguntando isso porque deseja aplicar um prefixo ao nome? Nesse caso, você pode fazer isso definindoViewData.TemplateInfo.HtmlFieldPrefix em seu controlador.

Aprendi muito sobre essas coisas no blog de Brad Wilson .

James McCormack
fonte
Este parece ser o vencedor! Lindo.
Rob Stevenson-Leggett
2
Sim, eles esconderam bem aquele, não foi :)
James McCormack
Isso só me salvou de alguma dor de cabeça e duplicação de código.
davidXYZ
13

EditorFor tem uma sobrecarga onde você pode fornecer o nameatributo como um parâmetro:

 @Html.EditorFor(expression, null, name)
Protetor um
fonte
1
Teria me salvado horas se eu tivesse encontrado isso horas atrás, haha
Johnie Karr
Interessante, mas não há sobrecarga para o atributo name para helpers semelhantes como DropDownListFor, você deve especificá-lo no parâmetro de atributos html (com um N maiúsculo em Nome).
nmit026
8

Experimente EditorFor . você pode passar string como nome de modelo se quiser ter certeza de que a caixa de texto é renderizada mesmo se o tipo de propriedade não for string. Se a propriedade já for string, ela não precisa templatenamerenderizar a caixa de texto explicitamente, então você pode passar null. Observe que ele não requer o parâmetro id explicitamente, ele o inferirá do nome do elemento. E todas as coisas de validação ainda estão ativas com EditorFor

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

A resposta de Ben me deu o que eu estava procurando, exceto que você precisa incluir em Html.Raw

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

Chama-se Microsoft GOTCHA

Use o nome em maiúsculas, assim

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

um pouco "despretensioso" =), tente:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")
Benwasd
fonte
Parece uma boa maneira fácil de fazer isso. Se um pouco hacky :-)
Rob Stevenson-Leggett
humm, desta forma, você não preferiria apenas pegar o Html.TexBox normal .. uma vez que qualquer digitação estática desaparece de qualquer maneira após a substituição
sharp johnny
1

Para mim, funciona! Espero que ajude!

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

Não tenho certeza de qual desses dois parâmetros de string no meio faz o trabalho, mas funcionou apenas quando eu digitei os dois.

Sr.Ajdos
fonte
É Id e Nome. isso funcionou para mim. Eu passei por todas as respostas acima e nenhuma delas funcionou, mas 1. Obrigado.
Orion
public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Não templateNametenho ideia do que deveria ser, então eu usei null. Pois htmlFieldNameusei o nome do parâmetro (no meu caso "ipmi" em vez de "IPMI"). Isso funcionou para mim.
BCdotWEB
0

Neste exemplo, desabilitei os campos do formulário com base nas permissões, mas ainda os mostrei. Eu tinha um campo oculto para enviar o valor ao controlador, mas queria um nome de campo diferente no EditorFor. O primeiro parâmetro após o valor do modelo representa a propriedade "nome", o segundo é o novo nome.

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

Resulta em:

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

Mantenha-o simples, você já fornecendo o ID, você deve simplesmente ser capaz de usar o método "TextBox" em vez de "TextBoxFor" e funcionará bem no lado do cliente e no lado do servidor. Além disso, embora a resposta aceita funcione, ela produzirá atributos de Nome duplicados em sua tag se você inspecioná-la usando um navegador. A solução abaixo não tem esse problema.

MvcHtmlString Html.TextBox (nome da string, valor da string, objeto htmlAttributes)

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