我正处于 MVC 的第一步。
在我的第一个示例中,我有一个这样的模型:
public class GuestResponse
{
[Required(ErrorMessage = "Please enter your name")]
public string Name { get; set; }
[Required(ErrorMessage = "Please enter your email")]
[RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")]
public string Email { get; set; }
public string Phone { get; set; }
[Required(ErrorMessage = "Please specify whether you'll attend")]
public bool? WillAttend { get; set; }
}
控制器:
public class HomeController : Controller
{
public ViewResult Index()
{
ViewData["greeting"] = (DateTime.Now.Hour < 12 ? "Good morning" : "Good afternoon");
return View();
}
[HttpGet]
public ViewResult RsvpForm()
{
return this.View();
}
[HttpPost]
public ViewResult RsvpForm(GuestResponse guestResp)
{
if (ModelState.IsValid)
{
return this.View("Thanks", guestResp);
}
else
{
return this.View();
}
}
}
和一个视图:
<body>
<div>
<h1>
Thank you,
<%: Model.Name %>.</h1>
<p>
<% if (Model.WillAttend == true)
{ %>
It's great that you're coming. The drinks are already in
the fridge!
<% }
else
{ %>
Sorry to hear you can't make it, but thanks for letting
us know.
<% } %>
</p>
</div>
对我来说奇怪的是,视图与模型紧密耦合:它使用像Model.WillAttend
ecc 这样的代码......那么如果模型在未来发生变化会发生什么?我应该改变这个特定视图中的所有片段(但也可能在许多其他视图中......)这是紧耦合还是我错过了这里的重点?
编辑
作者在书中指出,这种有用的机制是
模型绑定
鉴于方法 [public ViewResult RsvpForm(GuestResponse guestResp)] 是通过 HTTP 请求调用的,并且 GuestResponse 是 HTTP 完全不知道的 .NET 类型,那么 HTTP 请求怎么可能提供 GuestResponse 实例?答案是模型绑定,这是 ASP.NET MVC 的一个非常有用的特性,它通过将传入的键/值对与所需 .NET 类型上的属性名称进行匹配,自动解析传入的数据并用于填充操作方法参数。这种强大的、可定制的机制消除了与处理 HTTP 请求相关的许多单调乏味的工作,让您主要在强类型 .NET 对象方面工作,而不是在低级别摆弄 Request.Form[] 和 Request.QueryString[] 字典,如在 Web 表单中通常是必需的。
我的两分钱:但是,这种机制为您提供了视图中强类型类的优势(但是,由于 Visual Studio Intellisense功能,这非常有用,否则我认为 Request.Form[] 语法也适合相同的)。另一方面,您将视图与模型紧密耦合,因此模型的每一个微小变化都会导致链接视图的级联变化。