【问题标题】:Developing ASP.NET MVC web applications the right way以正确的方式开发 ASP.NET MVC Web 应用程序
【发布时间】:2011-12-30 04:27:49
【问题描述】:

我开始开发一个新的 ASP.NET MVC 应用程序,我想确保我对在 MVC 模式下开发应用程序的方式的理解是正确的。

问题1:假设我有一些主要视图(MainView1MainView2,...),其中有一些部分视图(PartialView1PartialView2,@987654325 @,...)。根据我对 MVC 的了解,我应该为每个视图定义一个模型。例如我必须定义PartialModelPartialModel2,...并且还定义我的主要模型,它们是已在其中使用的部分模型的容器:

public class MainModel1
{
    public PartialModel1 Partial1 {get;set}        
    public PartialModel2 Partial2 {get;set}
    public PartialModel3 Partial3 {get;set}
}

这样,当我想重定向到MainView 时,我可以使用这个模型来初始化该视图中使用的模型。我对 MVC 的理解正确吗?或者视图和模型之间的通信应该在 MVC 中以另一种形式出现吗?

问题2:如果以上是正确的,那么假设我在一些主视图页面中有部分视图。这个局部视图有一个调用操作方法的提交按钮。此操作方法应该以某种方式返回具有正确视图模型的主页视图。关于如何在部分视图的操作中获取/设置其他视图的视图模型有什么建议吗?

谢谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 model-view-controller view model


    【解决方案1】:

    你的理解是正确的。每个视图(无论是主视图还是部分视图)都应该有一个相应的视图模型(除非在非常罕见的情况下,该视图当然只包含静态 html)。按照这个逻辑,一个必须渲染其他局部视图的主视图将具有一个视图模型,该模型本身将具有对这些局部视图所需的视图模型的引用(可能作为属性)。

    还有另一种使用 Html.Action 助手的技术。在这种情况下,部分是通过另一个控制器/动作而不是主要的。所以你不需要在主视图模型中引用局部视图模型。它们将完全不同。查看following blog post 了解更多关于 Html.Action 的信息。

    【讨论】:

    • 谢谢达林。如果您也回答我更新的问题,我会很高兴。
    • @Kamyar,好吧,这个更难,这将取决于。没有单一的方法可以实现它。您可以以某种方式在控制器操作中重建主视图模型(从给定一些 id 的数据库中获取它),或者另一种可能性是简单地使用 AJAX,这样您就不必刷新整个页面,因此您不需要返回主视图模型,但只刷新包含部分视图的部分,因此在这种情况下您的控制器操作将只返回部分视图模型。但再一次没有一个好的做法。这将取决于。
    • 是的。我目前使用ajax。但我认为有时没有必要对它进行 ajaxify 处理。感谢达林的回复。
    【解决方案2】:

    你的理解完全没问题。这也是 Asp.net MVC 中的 ViewModel 可以参考的。

    那么,Asp.net MVC ViewModel 基本上是什么?

    在 ASP.NET MVC 中,ViewModel 允许您将来自一个或多个数据模型或数据源的多个实体塑造成单个对象,并针对视图的使用和呈现进行了优化。下图说明了 ViewModel 的概念:

    ViewModel 的目的是让视图有一个要呈现的对象,从而减轻视图中对 UI 逻辑代码的需求,否则这些代码是必需的。这意味着视图的唯一职责或关注点是呈现单个 ViewModel 对象,从而有助于更清晰地分离关注点 (SoC)。关注点是应用程序具有特定目的(即关注点)的不同方面,将这些方面分开意味着您的应用程序更有条理,代码更集中。将数据操作代码放在远离视图和控制器的自己的位置,强制执行 SoC。

    在 MVC 中使用 ViewModel 以获得更精细的粒度和更好的 SoC 会导致更易于维护和测试的代码。请记住,单元测试是关于测试小单元。

    除了更好的编码实践之外,还有许多商业原因说明了您可能考虑使用 ViewModel 的原因:

    • 将查找数据的下拉列表合并到相关实体中
    • 主从记录视图
    • 分页:结合实际数据和分页信息
    • 购物车或用户个人资料小部件等组件
    • 仪表板,包含多个不同数据源
    • 报告,通常包含汇总数据

    【讨论】:

    • 谢谢。如果您也看看问题 2,我会很高兴。
    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 2014-12-03
    • 1970-01-01
    • 2019-01-03
    • 2010-09-21
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多