Asp.net mvc MVC、强类型视图与关注点分离

Asp.net mvc MVC、强类型视图与关注点分离,asp.net-mvc,model-view-controller,dynamic,separation-of-concerns,strongly-typed-view,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.Titl

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

控制器:

[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>
查看:

[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>
查看:

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

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


在视图中使用分支代码可能是一种代码气味,实际上可能违反关注点分离,但这实际上取决于代码试图做什么。在您演示的情况下,我认为这不是一个冲突,因为视图中使用的字符串严格地用于演示目的。

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


在视图中使用分支代码可能是一种代码气味,实际上可能违反关注点分离,但这实际上取决于代码试图做什么。在您介绍的案例中,我认为这并不是一个违规行为,因为视图中使用的字符串严格是为了演示目的而存在的。

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


至于在视图中使用逻辑,我会说“视情况而定”。我使用了单独的视图,一个在几个部分(基于模型数据)之间进行选择的视图,控制流以选择HTML变体。选择哪种方法取决于模型/视图之间的差异。如果逻辑仅限于选择UI显示,我会将其保留在视图中。我更愿意这样做,然后将选择推回控制器。这将违反关注点的分离。

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


至于在视图中使用逻辑,我会说“视情况而定”。我使用了单独的视图,一个在几个部分(基于模型数据)之间进行选择的视图,控制流以选择HTML变体。选择哪种方法取决于模型/视图之间的差异。如果逻辑仅限于选择UI显示,我会将其保留在视图中。我更愿意这样做,然后将选择推回控制器。这将违反关注点分离。

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

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

该模型是一种被动介质,用于从分离的层传递信息。使模型强类型化会收紧两者之间的“契约”,但不会违反分离。您的数据访问方法可以从ADO演变为ORM,而无需重新访问视图代码。您的ORM可以重构为使用web服务,而根本不改变视图


只有当您决定更改视图的传入或传出值时,才必须更改视图。核心是关注点的分离。

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

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

该模型是一种被动介质,用于从分离的层传递信息。使模型强类型化会收紧两者之间的“契约”,但不会违反分离。您的数据访问方法可以从ADO演变为ORM,而无需重新访问视图代码。您的ORM可以重构为使用web服务,而根本不改变视图


只有当您决定更改视图的传入或传出值时,才必须更改视图。这一点的核心是关注点的分离。

如果我再多读几章,我就会得到答案。我太不耐烦了。“视图包含向用户显示模型元素所需的逻辑,仅此而已。”感谢所有人的反馈。无论谁有权,都可以将此“问题”标记为关闭/回答/删除。如果我再多读几章,我就会得到答案。我太不耐烦了。“视图包含向用户显示模型元素所需的逻辑,仅此而已。”感谢所有人的反馈。无论谁有权,都可以将此“问题”标记为已关闭/已回答/已删除