ASP.Net MVC:如何重用不同模型的视图和部分?

时间:2014-11-04 20:04:44

标签: asp.net-mvc

我需要根据我保存的用户类型显示不同的表单字段。

我有一些用户类型和一些用户类型具有相同的数据,因此您可以想象以下(可能有更多类型):

  1. TypeA:名称,密码等,LinkedToLegacySystemA,LegacySystemAUserId
  2. TypeB:名称,密码等,LinkedToLegacySystemB,LegacySystemBUserId
  3. TypeC:名称,密码等,LinkedToLegacySystemC,LegacySystemCUserId,LegacySystemCAdminLevel
  4. 当我创建一个新用户时,我可能处于任何这些系统的上下文中,但我确切地知道我所连接的系统(每个类型的用户都有一个特定的CRUD控制器),但我想分享观点(如果可能的话)。所以我得到了这个:TypeAUserController,TypeBUserController,TypeCUserController,每个都有自己的Create,Retrieve,Update和Delete Get / Post Actions。

    所以基本问题是"我如何重复使用视图为每个用户显示创建?"

    编辑: 为了进一步说明,每个用户都有共享信息,这是我想要分享的视图。我迄今为止提出的想法假设模型之间的差异将被封装在局部视图中,并且每个潜在模型都有自己的视图。因此,我们要查看用户的每个CRUD操作的单个页面级模型,然后查看封装差异的每个子模型的单个子模型。 由于下面列出的原因,这不是一个好方法。

4 个答案:

答案 0 :(得分:0)

潜在解决方案1: 将此模型传递给视图

  • CreateUserPageModel
    • BoringModelWithSharedStuff
    • LegacySystemAModel
    • LegacySystemBModel
    • LegacySystemCModel
    • PartialName

然后在视图中使用部分名称来决定显示哪个部分,并选择要传递给它的非空模型。

提交表单时,它会提交到一个带有自定义模型绑定器的页面,该页面将选择正确的模型。

优点:

  • 允许重复使用父视图
  • 模型中的差异放在不同的部分中

缺点:

  • 查看必须找到要填充的子模型以传递给部分
  • 必须传递PartialName,因此必须在控制器中选择路径

答案 1 :(得分:0)

潜在解决方案2:使用视图包。

模型非常简单:

  • CreateUserPageModel
    • SharedDataModel

然后,视图将检查Viewbag,以获取有关加载哪个部分的信息,方法是指定部分名称或提供要打开的视图的枚举。 然后,partial会将viewbag中的项目转换为特定类型。

优点:

  • 允许重复使用父视图
  • 模型中的差异放在不同的部分中

缺点:

  • 视图必须选择正确的部分加载
  • 部分必须转换为已知类型

答案 2 :(得分:0)

潜在解决方案3:使用标记界面

  • CreateUserPageModel
    • SharedDataModel
    • ILegacyUserDataModel
    • PartialName

View根据传递的模型加载部分,然后将ILegacyUserDataModel传递给partial。然后,部分将投射到它为其设计的任何模型。

优点:

  • 允许重复使用父视图
  • 模型中的差异放在不同的部分中

缺点:

  • 必须传递PartialName,因此必须在控制器中选择路径
  • 部分必须从界面转换为其设计的实际类型

答案 3 :(得分:0)

好的,这是实际实现的方式......

3页级"显示"每个CRUD上的GET模型,每个模型

  • CreateLegacyUserAModel
    • SharedUserModel Model(这个模型上有数据注释用于验证)
    • LegacyUserAModel(此文件上有数据注释用于验证)
  • ...
  • CreateLegacyUserCModel
    • ...

然后是观点:

  • CreateLegacyView(使用CreateLegacyUserAModel,处理创建表单)
    • SharedUserFieldsView(使用SharedUserModel)
    • LegacyUserFieldsView(使用LegacyUserAModel)

我们几乎翻转了视图/模型。

缺点

  • 需要每个CRUD操作的视图和特定模型(4 * n DisplayModels)
  • 每个CRUD操作一个POST(真的不是骗局,老实说,这对我来说很有意义)

赞成

  • 无需在任何地方投射任何模型​​,视图中没有强制转换,POST操作中也没有强制转换