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.


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

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 .


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)

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

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

4

Chama-se Microsoft GOTCHA

Use o nome em maiúsculas, assim

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

3

um pouco "despretensioso" =), tente:

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

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

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.


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

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" }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.