0

我刚从书中得到一个例子

控制器:

[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
4

3 回答 3

3

关注点分离不是耦合本身,而是描述谁负责什么。在控制器中创建 UI 元素违反了关注点分离,而填充数据则没有。控制器和视图之间必然存在一些必要的耦合。毕竟控制器动作必须提供视图用来生成 UI 的数据。通常,在执行 MVC 时,我更喜欢强类型视图和 model-per-view。这给了我视图代码中强类型数据的好处。在实践中,通常会混合使用强类型视图模型和一些 ViewBag 数据以用于横切关注点。

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

于 2013-01-21T22:46:50.960 回答
2

在视图中使用代码与拥有强类型视图不同。您可以轻松地拥有其中一个而没有另一个。强类型视图有几个优点,并且本身并不违反关注点分离。

在视图中使用分支代码可能会产生代码异味,实际上可能违反关注点分离,但这实际上取决于代码试图做什么。在您介绍的情况下,我认为这不是违规行为,因为视图中使用的字符串严格用于演示目的。

于 2013-01-21T22:46:30.077 回答
1

正如 tvanfosson 简洁解释的那样,关注点分离来自于控制器和视图的解耦。

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

模型是从分离层传递信息的被动媒介。使模型强类型化加强了两者之间的“契约”,但不违反分离。您的数据访问方法可以从 ADO 演变为 ORM,而无需重新访问查看代码。您的 ORM 可以重构为使用 Web 服务,而根本不更改视图。

只有当您决定更改视图的传入或传出值时,您才必须更改视图。从本质上讲,这就是关注点分离。

于 2013-01-21T23:14:04.180 回答