我刚从一本书中得到一个例子
控制器:
[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
答案 0 :(得分:3)
关注点的分离不是关于耦合本身,而是描述谁对什么负责。在控制器中创建UI元素违反了关注点分离,填充数据则没有。必要时,控制器和视图之间需要一些必要的耦合。在所有控制器操作必须提供视图用于生成UI的数据之后。通常,我喜欢在进行MVC时使用强类型视图和每视图模型。这给了我视图代码中强类型数据的好处。在实践中,通常会混合使用强类型视图模型以及一些ViewBag数据来解决这些问题。
至于在视图中使用逻辑,我会说“它取决于”。我使用了单独的视图,一个在几个部分(基于模型数据)之间选择的视图,用于选择HTML变体的流控制。选择哪种方法取决于模型/视图之间的差异。如果逻辑只围绕选择UI显示,我很乐意将它留在视图中。我宁愿把它推回控制器。这将违反关注点分离。
答案 1 :(得分:2)
在视图中使用代码与强类型视图不同。你可以很容易地拥有一个没有另一个。强类型视图有几个优点,本身并不违反关注点分离。
在视图中使用分支代码可能是代码异味,实际上可能违反了关注点的分离,但这实际上取决于代码尝试执行的操作。在您提交的案例中,我认为这不是违规行为,因为视图中使用的字符串仅用于演示目的。
答案 2 :(得分:1)
与Web表单和asp经典相反,MVC架构将逻辑层(Controller)与表示层(View)分开。只要每个代码位于不同的位置,我们就实现了分离关注。
模型是一种被动介质,用于从分离的层传递信息。使模型强类型收紧2之间的“契约”,但不违反分离。您的数据访问方法可以从ADO演变为ORM,而无需重新访问View Code。您可以重构ORM以使用Web服务,而无需更改View。
仅当您决定更改视图的传入或传出值时,您才需要更改视图。而核心问题是分离关注。