探索 ASP.NET MVC3/4 中的显示和编辑器模板






3.95/5 (10投票s)
为 MVC3 中的原始类型渲染自定义 HTML 标记。
引言
在本文中,我将介绍 ASP.NET MVC 3 的一个优秀(扩展)功能。 我演示了显示/编辑器模板,这是 MVC 在处理大型项目(用于一致的 UI)时一个非常有用的功能。
MVC 框架足够智能,可以为所有类型的数据(字符串、整数、布尔值等)呈现 HTML,但有时我们希望为我们的项目做一些不同的/特殊的事情(例如,如果我们不想要一个布尔值的复选框,那么我们不能使用 `EditorFor` 方法)。 本文是关于所有类型数据的一致的 HTML 标记。
背景
我个人喜欢探索技术。 当我刚接触 ASP.NET MVC 时,我习惯为每个属性编写自定义编辑器和显示,尽管我知道 `@Html.EditorForModel()`,但它呈现的 HTML 并不熟悉,所以我过去常常这样做:`@Html.TextBox(Mode.value, new {@class="fancyTextbox"})`。
当我们在 MVC 框架中有很棒的功能(`@Html.EditorForModel()` 和 `@Html.DisplayForModel()` 以及 site.css(默认值)可以修改用户界面时,为每个属性生成 HTML 总是很痛苦。
使用代码
在开始编码之前,我必须告诉你
在我的默认 MVC 应用程序文件夹结构中,我必须在 Views/Shared 文件夹中添加 2 个文件夹,这些文件夹将保存我的视图。
- DisplayTemplates:此文件夹将包含用于基本属性(默认数据)的只读 HTML 控件
- EditorTemplates:此文件夹将包含用于基本属性(默认数据)的可编辑 HTML 控件
注意:请使用相同的命名约定,不仅适用于本文,也适用于整个 MVC 框架。
现在让我们从模型开始,它主要讲述我们将在视图中呈现什么类型的数据。
我将使其易于理解。 所以我使用了两种常见的类型:整数和布尔值。
这是我的模型代码
模型
public class MyModel
{
public bool boolProp { get; set; }
public int intProp { get; set; }
}
这是我的控制器代码
它将模型对象传递到视图中
public class HomeController : Controller
{
public ViewResult CheckMyTemplate()
{
MyModel model = new MyModel();
model .boolProp = true;
model.intProp = 10;
return View(model);
}
}
最后,这是我的视图
显示视图模板
对于布尔类型
视图名称:Boolean.cshtml
@model System.Boolean? <h2>boolean</h2> Its a boolean Display Template <br />Boolean Value : @Model
对于整数类型
视图名称:Int32.cshtml
@model System.Int32?
<h2>integer</h2>
Its a integer Display Template
<br /> Max Value=@((Int32)Model)
编辑器视图模板
对于布尔类型
为布尔类型显示下拉列表
视图名称:Boolean.cshtml
@Html.DropDownList("", new SelectList( new[] {
new { Value = "true", Text = "Yes" },
new { Value = "false", Text = "No" },
},
"Value",
"Text",
Model
))
对于整数类型
在下拉列表中写入整数值。
视图名称:Int32.cshtml
@model System.Int32?
<h2>integer</h2>
Its a integer Editor Template
<select name="options" id="options">
@for (int i = 0; i<(Int32)Model; i++ )
{
<option id="">@(i+1)</option>
}
</select>
注意:我使用 ? 来处理可空值。
编辑器视图必须放置在 EditorTemplates 中,而显示视图必须放置在 DisplayTemplate 中.
关注点
编写对所有模型通用的模板非常有趣且容易,它真的会节省您宝贵的时间。 不仅如此,我们还可以为 `Object`(类)类型创建显示和视图模板。
除此之外,MVC 中还有一个有趣的功能:自定义模型绑定 :)。