MVC,强类型视图与关注点分离

时间:2013-01-21 22:39:49

标签: asp.net-mvc model-view-controller dynamic separation-of-concerns strongly-typed-view

我刚从一本书中得到一个例子

控制器:

[HttpPost]
public ViewResult RsvpForm(GuestResponse guestResponse)
{
   // TODO: Email guestResponse to the part organizer
   return View("Thanks", guestResponse);
}

查看:

@model MvcApplication1.Models.GuestResponse 
@{
    ViewBag.Title = "Thanks";
}
<div>
    <h1>Thank you, @Model.Name!</h1>

    @if (Model.WillAttend == true)
    {
        @:It's great that you're coming. The drinks are already in the fridge!
    }
    else
    {
        @:Sorry to hear that you can't make it, but thanks for letting us know.
    }
</div>

我认为这种方法违背了分离视图和模型/控制器逻辑的概念。

我的方法是:

控制器:

  [HttpPost]
    public ViewResult RsvpForm(GuestResponse guestResponse)
    {
        ViewResult v = View("Thanks");
        v.ViewBag.Name = guestResponse.Name;

        if (guestResponse.WillAttend)
        {
            v.ViewBag.Message = "It's great that you're coming. The drinks are already in the fridge!";
        }
        else
        {
            v.ViewBag.Message = "Sorry to hear that you can't make it, but thanks for letting us know.";
        }

        return v;
    }

查看:

@{
    ViewBag.Title = "Thanks";
}
<div>
    <h1>Thank you, @ViewBag.Name!</h1>

    @ViewBag.Message;

</div>

这个“问题”的目的是澄清视图应该用于查看和控制器来控制要显示的内容,并且书籍示例是“坏方法”(我考虑的是作者只是想要的事实显示MVC的能力

现在使用强类型视图(带逻辑代码)真是个好主意,还是回归到ASP意粉代码?

考虑到高质量的企业设计,请提供一些好的反馈

更新 我知道这是一个微不足道的例子,没有验证这样的,但是将这个逻辑放在模型中,然后在视图上访问结果就是一个很好的做法(为了这个例子):

@Model.Message

3 个答案:

答案 0 :(得分:3)

关注点的分离不是关于耦合本身,而是描述谁对什么负责。在控制器中创建UI元素违反了关注点分离,填充数据则没有。必要时,控制器和视图之间需要一些必要的耦合。在所有控制器操作必须提供视图用于生成UI的数据之后。通常,我喜欢在进行MVC时使用强类型视图和每视图模型。这给了我视图代码中强类型数据的好处。在实践中,通常会混合使用强类型视图模型以及一些ViewBag数据来解决这些问题。

至于在视图中使用逻辑,我会说“它取决于”。我使用了单独的视图,一个在几个部分(基于模型数据)之间选择的视图,用于选择HTML变体的流控制。选择哪种方法取决于模型/视图之间的差异。如果逻辑只围绕选择UI显示,我很乐意将它留在视图中。我宁愿把它推回控制器。这将违反关注点分离。

答案 1 :(得分:2)

在视图中使用代码与强类型视图不同。你可以很容易地拥有一个没有另一个。强类型视图有几个优点,本身并不违反关注点分离。

在视图中使用分支代码可能是代码异味,实际上可能违反了关注点的分离,但这实际上取决于代码尝试执行的操作。在您提交的案例中,我认为这不是违规行为,因为视图中使用的字符串仅用于演示目的。

答案 2 :(得分:1)

正如tvanfosson简洁地解释的那样,关注点分离来自Controller和View的分离。

与Web表单和asp经典相反,MVC架构将逻辑层(Controller)与表示层(View)分开。只要每个代码位于不同的位置,我们就实现了分离关注。

模型是一种被动介质,用于从分离的层传递信息。使模型强类型收紧2之间的“契约”,但不违反分离。您的数据访问方法可以从ADO演变为ORM,而无需重新访问View Code。您可以重构ORM以使用Web服务,而无需更改View。

仅当您决定更改视图的传入或传出值时,您才需要更改视图。而核心问题是分离关注。