最近,当我开始设计一个必须处理许多数据源的复杂View时,我在项目中遇到了一个难看的问题。视图的目的是显示与客户资料相关的数据,但该资料由以下内容构成:基本信息,涉及的项目,财务数据和联系信息。所有数据必须在同一视图中分组,并且必须是可更新的。除此之外,在视图的右窗格中,有一些小部件指向与客户信息无关的其他来源。 我解决这个问题的方法是:
personalInfoModel
,cutomerProjectModel
,financialInfoModel
和contactInfoModel
。顺便说一句,我使用的是Microsoft实体框架,因此这里的每个模型都与实体一对一匹配。使用这个混合模型,我建立了与主View的连接(比如说CustomerView),所以在视图代码的第一行你可以看到类似的东西:
<%@ Page ..... Inherits="...MyProject.Models.hybridCustomerModel"
在主视图中我使用:
<% Html.RenderPartial("UC_BasicInfo"); %>
<% Html.RenderPartial("UC_ProjectInfo"); %>
<% Html.RenderPartial("UC_FinancialInfo"); %>
<% Html.RenderPartial("UC_ContactInfo"); %>
这是因为我希望通过用户控件来渲染主视图来简化一些事情。
每个用户控件(¨* .ascx)都指向混合模型,因此我可以毫无问题地在表单的控件中进行绑定。
在控制器中,事情看起来有点混乱。对于每个* .ascx,都有一个处理“发布请求”的操作方法。但是初始加载或Get请求是在唯一与视图名称匹配的操作方法中进行的:CustomerView。 出于可用性和响应性的目的,我使用jquery来发布请求。 但问题在于我需要做很多工作将混合模型映射到Post Request中涉及的普通模型,因为DATA层只接收与模型创建的每个实体映射的模型。
< / LI>最后,我在视图的右侧窗格中使用:<% Html.RenderAction() %>
作为窗口小部件,以便从我正在使用的混合模型中获取数据。
我想问你在这种情况下是否有一些不同的更好的方法?
答案 0 :(得分:0)
我认为您可以使用几种方法来简化此操作。
首先,不是混合视图,为什么不组成一个视图模型类。这将包含您的混合数据,但将是纯poco类。当你控制暴露的字段时,它更容易绑定。
为每个ascx设置一个控制器方法并不是一件坏事,但如果您更喜欢一个,并将页面包装在一个Form中,您可以使用button type =“submit”(而不是输入type = submit)或javascript告诉我按下了哪个按钮,以及发布的viewdata的哪个位映射回你的EF类。
另一种方法,鉴于你已经对javascript采取了依赖,这是我赞成的:
我尝试将页面解耦为独立的部分,为每个部分提供一对控制器方法(Get和Post),并通过使用Ajax类型调用请求每个部分来组装页面。你在这里的关键点取决于一个更新是否一个级联到另一个:如果相互依赖是固定的和非循环的,这将很容易解决,否则你可能需要开发某种轻型消息传递框架 - 或者只是允许某些类型的更新触发整页刷新。