2

我正处于 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.WillAttendecc 这样的代码......那么如果模型在未来发生变化会发生什么?我应该改变这个特定视图中的所有片段(但也可能在许多其他视图中......)这是紧耦合还是我错过了这里的重点?

编辑

作者在书中指出,这种有用的机制是

模型绑定

鉴于方法 [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[] 语法也适合相同的)。另一方面,您将视图与模型紧密耦合,因此模型的每一个微小变化都会导致链接视图的级联变化。

4

1 回答 1

2

这是紧密耦合还是我错过了这里的重点

是的,它是紧密耦合的,您可能缺少的一点是 - 这不是MMVC 中的,这是一种称为视图模型的不同类型的模型,它应该为特定视图量身定制,因此它的耦合是有意义的。

它通常被称为MVVM,它是 MVC 的派生,它引入了视图模型的概念,以将您的实际模型与视图分离。

于 2013-10-02T07:54:55.567 回答