2011-06-29 34 views
0

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

  1. 创建一个混合模式,它是一个混合各种车型像:personalInfoModelcutomerProjectModelfinancialInfoModelcontactInfoModel。顺便说一下,我正在使用Microsoft实体框架,因此这里的每个模型都与一个实体一一对应。
  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,都有一个操作的方法处理“发布请求”。但是,初始加载或Get请求是在与View Name:CustomerView匹配的唯一操作方法内部进行的。 为了可用性和响应的目的,我使用jquery来发布帖子请求。 但问题是我需要做很多工作将混合模型与Post Request中涉及的纯模型进行映射,因为DATA层只接收与模型创建的每个实体映射的模型。

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

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

回答

0

我认为有几种方法可以用来简化这一点。

首先不是混合视图,为什么不构成视图模型类。这将包含你的混合数据,但将是一个纯粹的poco类。当你控制暴露的领域时,它更安全地绑定。

为每个ascx设置一个控制器方法并不是什么坏事,但是如果你更喜欢一个,并且把页面包装在一个表单中,你可以使用button type =“submit”(而不是input type = submit )或javascript来告诉哪个按钮被按下,以及发布的viewdata的哪一位映射回你的EF类。

另一种方法,并给予您已经采取的JavaScript的依赖,这是一个我赞成:

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