2

我正处于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 []语法将适合相同)。另一方面,您将视图与模型紧密耦合,以便模型的每一个细微变化都会导致链接视图发生级联变化。

回答

2

这是紧耦合还是我在这里错过了点

是的,它是紧耦合的,你也许缺少一点是 - 这不是MVC中的M,这是一个不同类型的的模型称为视图模型,它应该是针对特定视图定制的,所以它是合理的,它是耦合的。

它通常被称为MVVM,MVC的推导引入了视图模型的概念,从视图中分离您的实际模型。

+0

我明白你的观点......然而这个例子取自MVC的史蒂文桑德森之书。这是本书中介绍的MVC的第一个例子,作者明确指出这是MVC(不是MVVM)。 – spiderman77

+0

嗯,我猜他在某些方面是正确的 - 但是,这个架构几乎是一样的。 – James