MVC和Razor中的Html.TextboxFor和Html.EditorFor之间的差异

时间:2011-01-28 08:17:09

标签: asp.net-mvc asp.net-mvc-3 razor

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

我发现了这个

  

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

5 个答案:

答案 0 :(得分:155)

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

答案 1 :(得分:116)

TextBoxFor :它将呈现与指定表达式对应的文本输入html元素。简单来说,它总是像输入文本框一样呈现,而不管属性的数据类型是否与控件绑定。

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

使用EditorFor有什么好处?

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

答案 2 :(得分:54)

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

当EditorFor查看类型和元信息时,可以渲染另一个控件或您提供的模板。

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

答案 3 :(得分:7)

这是之前评论中未提及的基本差异之一:
override func viewDidLoad() { datePickerView.datePickerMode = UIDatePickerMode.Date datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged) self.tfDateNaissance.inputView = self.datePickerView //your text field //I add a toolBar to the datePicker let pickerToolBar = UIToolbar() pickerToolBar.barStyle = UIBarStyle.BlackOpaque //you can change the style pickerToolBar.translucent = true pickerToolBar.tintColor = UIColor.redColor() // or other colours pickerToolBar.sizeToFit() let spaceButtonPicker = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) let cancelButtonPicker = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelDatePicker:") pickerToolBar.setItems([cancelButtonPicker, spaceButtonPicker], animated: false) pickerToolBar.userInteractionEnabled = true tfDateNaissance.inputAccessoryView = pickerToolBar } func datePickerValueChanged(sender: UIDatePicker) { let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle tfDateNaissance.text = dateFormatter.stringFromDate(sender.date) //if you leave resignFirstResponder() here, the picker will close as soon as the value change } 属性适用于textbox for,它不适用于func cancelDatePicker(sender: UIBarButtonItem){ tfDateNaissance.resignFirstResponder() }

Readonly

以上代码有效,如下所示,您无法控制只读

EditorFor

答案 4 :(得分:4)

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