我正处于MVC的第一步。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>
什么似乎很奇怪对我来说,就是那个Vi ew与模型紧密耦合:它使用像Model.WillAttend
ecc这样的代码......那么如果在未来的模型更改时会发生什么?我应该改变这个特定的视图内的所有片段(但也可能在许多其他视图中...) 这是紧耦合还是我错过了这里的观点?
编辑
在这本书中作者指出,这种有用的机制是
模型绑定
鉴于方法[公众的ViewResult RsvpForm(GuestResponse guestResp) ]正在通过HTTP请求调用 ,并且GuestResponse是HTTP完全未知的.NET类型, HTTP请求如何可能提供GuestResponse实例?答案是模型绑定,ASP.NET MVC的一个非常有用的功能,通过传入的键/值对与所需的.NET类型的属性 的名称匹配,传入数据被自动分析并用于 填充操作方法参数。 这个强大的可自定义机制消除了很多与处理HTTP请求相关的单调乏味的管道,让您主要在强类型的.NET对象方面工作,而不是在使用Request.Form []和Request.QueryString []方法的低级别操作方面工作而不是 。字典,在Web窗体中经常需要 。由于在RsvpForm.aspx中定义的输入控件的名称为 ,与GuestResponse上属性的名称相对应,框架将向您的动作 方法提供一个GuestResponse实例,该实例已经完全填充了用户输入到 表单中的任何数据。
我的两分钱:不过如此,这个机制给您的视图内强类型类(其中,但是,是真正有用的感谢到Visual Studio 智能感知功能的优势,否则在我看来也请求。 Form []语法将适合相同)。另一方面,您将视图与模型紧密耦合,以便模型的每一个细微变化都会导致链接视图发生级联变化。
我明白你的观点......然而这个例子取自MVC的史蒂文桑德森之书。这是本书中介绍的MVC的第一个例子,作者明确指出这是MVC(不是MVVM)。 – spiderman77
嗯,我猜他在某些方面是正确的 - 但是,这个架构几乎是一样的。 – James