MVC和Razor中的Html.TextboxFor和Html.EditorFor之间的区别

为什么在添加一个新的“编辑”视图时默认情况下会改变? 使用EditorFor()TextboxFor()时有什么优势?

我find了这个

默认情况下,创build和编辑脚手架现在使用Html.EditorFor帮手,而不是Html.TextBoxFor帮手。 当“添加视图”对话框生成视图时,这会以数据注记属性的forms改进对模型上元数据的支持。

EditorFor的优点是你的代码不会绑定到<input type="text" 。 所以如果你决定改变你的文本框的渲染方式,就像把它们包装到一个div你可以直接在你的应用程序中编写一个自定义的编辑器模板( ~/Views/Shared/EditorTemplates/string.cshtml )和所有的文本框将自动受益于这种变化,而如果你有硬编码Html.TextBoxFor你将不得不修改它到处。 你也可以使用数据注解来控制它的呈现方式。

TextBoxFor :它将渲染像文本inputhtml元素对应的指定expression式。 简单地说,它将总是像input文本框一样呈现,而不pipe与该控件绑定的属性的数据types如何。

EditorFor :这个控件有点聪明。 它根据属性的数据types呈现HTML标记。 例如,假设模型中有一个布尔属性。 要将视图中的这个属性作为一个checkbox,我们可以使用CheckBoxFor或EditorFor。 两者都会生成相同的标记。

使用EditorFor的优点是什么?

正如我们所知,根据属性的数据types,它会生成html标记。 所以假设明天如果我们改变模型中的属性的数据types,不需要改变视图中的任何东西。 EditorFor控件将自动更改html标记。

Html.TextboxFor总是创build一个文本框( <input type="text" ... )。

虽然EditorFor查看types和元信息,并可以呈现另一个控件或您提供的模板。

例如,对于DateTime属性,您可以创build一个使用jQuery DatePicker的模板。

这是以前评论中没有提到的基本差异之一:
Readonly财产将与文本框工作,它不会与EditorFor工作。

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

上面的代码工作,在跟随你无法控制只读

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

string数据types的html输出也有细微差别。

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