【问题标题】:MVC 3 design of composed viewsMVC 3 组合视图的设计
【发布时间】:2011-06-29 03:56:04
【问题描述】:

最近,当我开始设计一个必须处理许多数据源的复杂视图时,我在项目中遇到了一个丑陋的问题。视图的目的是显示与客户资料相关的数据,但此资料由以下组成:基本信息、涉及的项目、财务数据和联系信息。所有这些数据必须分组在同一个视图中,并且必须是可更新的。除此之外,在视图的右窗格中,还有一些小部件指向与客户信息无关的其他来源。 我解决这个问题的方法是:

  1. 创建一个混合模型,它混合了各种模型,例如:personalInfoModelcutomerProjectModelfinancialInfoModelcontactInfoModel。顺便说一句,我使用的是微软实体框架,所以这里的每个模型都与一个实体一一匹配。
  2. 使用这种混合模型,我建立了与主视图(假设是 CustomerView)的连接,因此在视图代码的第一行中,您可以看到如下内容:

    <%@ Page ..... Inherits="...MyProject.Models.hybridCustomerModel"
    
  3. 在我使用的主视图中:

    <% Html.RenderPartial("UC_BasicInfo"); %>
    <% Html.RenderPartial("UC_ProjectInfo"); %>
    <% Html.RenderPartial("UC_FinancialInfo"); %>
    <% Html.RenderPartial("UC_ContactInfo"); %>
    

    这是因为我想通过用户控件来简化一些事情来呈现主视图。

  4. 每个用户控件 (¨*.ascx) 都指向混合模型,因此我可以毫无问题地在表单的控件中进行绑定。

  5. 在控制器中,事情看起来有点混乱。对于每个 *.ascx 都有一个处理“发布请求”的操作方法。但是初始加载或获取请求是在唯一与视图名称匹配的操作方法中进行的:CustomerView。 出于可用性和响应性的目的,我使用 jquery 来发出 post 请求。 但问题是我需要做很多工作将混合模型与 Post Request 中涉及的普通模型映射,因为 DATA 层只接收与模型创建的每个实体映射的模型。

  6. 最后,我使用:&lt;% Html.RenderAction() %&gt; 作为视图右侧窗格中的小部件,以便从我正在使用的混合模型中获取数据。

我想问你在这种情况下是否有一些不同的更好的方法?

【问题讨论】:

    标签: entity-framework asp.net-mvc-3 viewmodel


    【解决方案1】:

    我认为您可以使用几种方法来简化此操作。

    首先,为什么不组成一个视图模型类,而不是混合视图。这将包含您的混合数据,但将是一个纯 poco 类。绑定到它更安全,因为您可以控制公开哪些字段。

    为每个 ascx 拥有一个控制器方法并不是一件坏事,但如果您更喜欢一个,并且要将页面包装在一个表单中,您可以使用 button type="submit"(而不是 input type=submit)或 javascript 来判断按下了哪个按钮以及将发布的视图数据的哪一部分映射回您的 EF 类。

    另一种方法,鉴于您已经依赖于 javascript,这是我喜欢的方法:

    我会尝试将页面分离为独立的部分,为每个部分提供一对控制器方法(Get 和 Post),并通过使用 Ajax 类型调用请求每个部分来组装页面。您在这里的症结取决于一个更新是否会级联到其他更新:如果相互依赖是固定的且非循环的,这将很容易解决,否则您可能需要开发某种轻型消息传递框架 - 或者只允许某些类型的更新触发整页刷新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多