Diferenças entre Html.TextboxFor e Html.EditorFor no MVC e Razor

170

Por que eles foram alterados por padrão ao adicionar uma nova visualização "editar"? Quais são as vantagens ao usar EditorFor()vs. TextboxFor()?

Eu achei isto

Por padrão, os andaimes Criar e Editar agora usam o auxiliar Html.EditorFor em vez do auxiliar Html.TextBoxFor. Isso melhora o suporte a metadados no modelo na forma de atributos de anotação de dados quando a caixa de diálogo Adicionar exibição gera uma exibição.

ShaneKm
fonte
5
alguém tem um exemplo de como isso é feito? por exemplo, escrevendo editor para um DatePicker?
precisa saber é o seguinte

Respostas:

166

A vantagem EditorForé que seu código não está vinculado a um <input type="text". Então, se você decidir mudar algo para o aspecto de como suas caixas de texto são processados como envolvê-los em um divvocê poderia simplesmente escrever um modelo de editor personalizado ( ~/Views/Shared/EditorTemplates/string.cshtml) e todas as caixas de texto em seu aplicativo se beneficiarão automaticamente de esta mudança enquanto se você tiver codificado Html.TextBoxForvocê terá que modificá-lo em qualquer lugar. Você também pode usar as anotações de dados para controlar a maneira como isso é renderizado.

Darin Dimitrov
fonte
Há um erro, provavelmente em uma versão antiga. EditorFor não reconhece 'double'. Para 'long' considera-lo como 'int' e step = "0,01" não funciona em atributos então eu usei TextBoxFor e acrescentou @ type = 'número' @ passo = "0,01" para que ele trabalhou
Charlie
129

TextBoxFor : Ele renderizará como o elemento html de entrada de texto correspondente à expressão especificada. Em palavras simples, ele sempre será renderizado como uma caixa de texto de entrada, independentemente do tipo de dados da propriedade que está sendo vinculada ao controle.

EditorFor : Este controle é um pouco inteligente. Renderiza a marcação HTML com base no tipo de dados da propriedade. Por exemplo, suponha que exista uma propriedade booleana no modelo. Para renderizar essa propriedade na exibição como uma caixa de seleção, podemos usar CheckBoxFor ou EditorFor. Ambos irão gerar a mesma marcação.

Qual é a vantagem de usar o EditorFor?

Como sabemos, dependendo do tipo de dados da propriedade, ela gera a marcação html. Portanto, suponha que amanhã, se alterarmos o tipo de dados da propriedade no modelo, não será necessário alterar nada na exibição. O controle EditorFor altera a marcação html automaticamente.

Harshal
fonte
15
resposta ótima e simples que pode ser facilmente absorvida, mesmo por um novato.
Reis
a descrição acima ajudará este link forums.asp.net/t/1948071.aspx?EditorFor+and+EditorForModel
Amol Shiledar
Existe sempre um caso em que você absolutamente deve usar o TextBoxFor?
precisa saber é o seguinte
55

O Html.TextboxForsempre cria uma caixa de texto ( <input type="text" ...).

Enquanto o EditorFor examina o tipo e as informações meta, e pode renderizar outro controle ou modelo fornecido.

Por exemplo, para propriedades DateTime, você pode criar um modelo que use o jQuery DatePicker.

GvS
fonte
12
Algum exemplo de como implementar o jquery datepicker usando o editfor?
Peru
2
obrigado por simplificar a diferença usando o caso data e hora.
Reis
1
@Peru, aqui ou aqui é como implement jquery datepickere usá-lo com EditorForé aqui
shaijut
8

Essa é uma das diferenças básicas não mencionadas nos comentários anteriores: a
Readonlypropriedade funcionará com a caixa de texto para e não funcionará EditorFor.

@Html.TextBoxFor(model => model.DateSoldOn, new { @readonly = "readonly" })

O código acima funciona, onde, como a seguir, você não pode fazer o controle somente leitura .

@Html.EditorFor(model => model.DateSoldOn, new { @readonly = "readonly" })
Lalitha1729
fonte
16
Você pode fazer EditorFor somente leitura usando a seguinte sintaxe: @ Html.EditorFor (modelo => model.DateSoldOn, new {htmlAttributes = new {@readonly = "somente leitura"}})
Doug Knudsen
4

Também há uma pequena diferença na saída html para um tipo de dados string.

Html.EditorFor:  
<input id="Contact_FirstName" class="text-box single-line" type="text" value="Greg" name="Contact.FirstName">

Html.TextBoxFor:
<input id="Contact_FirstName" type="text" value="Greg" name="Contact.FirstName">
Greg Gum
fonte
2
é uma resposta absolutamente errada, porque a principal diferença é que o Texbox retorna input e editorfor retorna seu modelo em que input é modelo padrão para editorfor.
Artem G