MVC 3组合视图的设计

时间:2011-06-29 03:56:04

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

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

  1. 创建一个混合模型,它混合了各种模型,如:personalInfoModelcutomerProjectModelfinancialInfoModelcontactInfoModel。顺便说一句,我使用的是Microsoft实体框架,因此这里的每个模型都与实体一对一匹配。
  2. 使用这个混合模型,我建立了与主View的连接(比如说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,都有一个处理“发布请求”的操作方法。但是初始加载或Get请求是在唯一与视图名称匹配的操作方法中进行的:CustomerView。 出于可用性和响应性的目的,我使用jquery来发布请求。 但问题在于我需要做很多工作将混合模型映射到Post Request中涉及的普通模型,因为DATA层只接收与模型创建的每个实体映射的模型。

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

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

1 个答案:

答案 0 :(得分:0)

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

首先,不是混合视图,为什么不组成一个视图模型类。这将包含您的混合数据,但将是纯poco类。当你控制暴露的字段时,它更容易绑定。

为每个ascx设置一个控制器方法并不是一件坏事,但如果您更喜欢一个,并将页面包装在一个Form中,您可以使用button type =“submit”(而不是输入type = submit)或javascript告诉我按下了哪个按钮,以及发布的viewdata的哪个位映射回你的EF类。

另一种方法,鉴于你已经对javascript采取了依赖,这是我赞成的:

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