ChatGPT解决这个技术问题 Extra ChatGPT

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

为什么默认情况下在添加新的“编辑”视图时会更改这些内容?使用 EditorFor()TextboxFor() 相比有哪些优势?

我找到了这个

默认情况下,Create 和 Edit 脚手架现在使用 Html.EditorFor 助手而不是 Html.TextBoxFor 助手。当“添加视图”对话框生成视图时,这改进了对数据注释属性形式的模型元数据的支持。

Quoted from here.

有没有人有一个如何做到这一点的例子?例如为 DatePicker 编写编辑器?

D
Darin Dimitrov

EditorFor 的优点是您的代码不绑定到 <input type="text"。因此,如果您决定更改文本框的呈现方式,例如将它们包装在 div 中,您只需编写自定义编辑器模板 (~/Views/Shared/EditorTemplates/string.cshtml),应用程序中的所有文本框都将自动受益于此更改而如果您对 Html.TextBoxFor 进行了硬编码,则必须在任何地方对其进行修改。您还可以使用数据注释来控制呈现方式。


有一个错误,可能在旧版本中。 EditorFor 无法识别“双重”。对于 'long',它认为它是 'int' 并且 step="0.01" 在属性中不起作用,所以我使用了 TextBoxFor 并添加了 @type='number' @step="0.01" 所以它起作用了
H
Harshal

TextBoxFor:它将呈现与指定表达式对应的文本输入html元素。简而言之,无论与控件绑定的属性的数据类型如何,它都会像输入文本框一样呈现。

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

使用 EditorFor 有什么好处?

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


很好,简单的答案,即使是新手也很容易吸收。
有没有绝对应该使用 TextBoxFor 的情况?
M
Mariusz Jamro

Html.TextboxFor 始终创建一个文本框 (<input type="text" ...)。

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

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


关于如何使用 editfor 实现 jquery datepicker 的任何示例?
感谢您通过使用日期时间案例来简化差异。
@Peru,herehere 是如何使用 implement jquery datepicker 并将其与 EditorFor 一起使用是 here
如果想将 jquery datepicker 与 TextBoxFor 一起使用怎么办?
V
Vikrant

这是先前评论中未提及的基本区别之一:
Readonly 属性将适用于 textbox for,但不适用于 EditorFor

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

上面的代码有效,与以下代码一样,您无法将控制设为只读。

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

您可以使用以下语法将 EditorFor 设为只读:@Html.EditorFor(model => model.DateSoldOn, new { htmlAttributes = new { @readonly = "readonly" } })
G
Greg Gum

字符串数据类型的 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">

这是绝对错误的答案,因为关键区别在于 Texbox 返回输入,而 editorfor 返回您的模板,其中输入是 editorfor 的默认模板。