Asp.net mvc Net MVC:如何在不同的模型中重用视图和部分?

Asp.net mvc Net MVC:如何在不同的模型中重用视图和部分?,asp.net-mvc,Asp.net Mvc,我需要根据保存的用户类型显示不同的表单字段 我有一些用户类型,一些用户类型具有相同的数据,因此您可以想象以下情况(可能会有更多类型): TypeA:名称、密码等,LinkedToLegacySystemA,LegacySystemAUserId TypeB:名称、密码等,LinkedToLegacySystemB,LegacySystemBUserId 类型C:名称、密码等,LinkedToleGacySystem C、LegacySystemCUserId、LegacySystemCAdmin

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

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

  • TypeA:名称、密码等,LinkedToLegacySystemA,LegacySystemAUserId
  • TypeB:名称、密码等,LinkedToLegacySystemB,LegacySystemBUserId
  • 类型C:名称、密码等,LinkedToleGacySystem C、LegacySystemCUserId、LegacySystemCAdminLevel
  • 当我创建一个新用户时,我可能处于这些系统的上下文中,但我确切地知道我连接到哪个系统(每种类型的用户上都有一个特定的CRUD控制器),但我希望共享视图(如果可能)。我有了:TypeAUserController、TypeBUserController、TypeCUserController,每个都有自己的创建、检索、更新和删除Get/Post操作

    所以基本问题是“如何重用视图来为每个用户显示和创建?”

    编辑: 为了进一步澄清,每个用户都有共享信息,这是我想要共享的视图。到目前为止,我提出的想法假设模型之间的差异将封装在局部视图中,并且每个潜在模型都有自己的视图。因此,我们将为用户上的每个CRUD操作寻找一个页面级别的模型,然后为每个子模型寻找一个封装差异的子模型。 这不是一个好方法,原因如下。

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

    • CreateUserPageModel
      • 具有共享内容的BoringModel
      • LegacySystemodel
      • LegacySystemB模型
      • LegacySystemC模型
      • 部分名称
    然后在视图中使用分部名称来决定要显示哪个分部,并选择要传递给它的非空模型

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

    好处:

    • 允许重用父视图
    • 模型的差异被放在不同的部分
    缺点:

    • 视图必须找到填充的子模型才能传递到局部模型
    • 必须传递PartialName,因此必须在控制器中选择路径

    潜在解决方案2:使用观察袋

    模型将非常简单:

    • CreateUserPageModel
      • 共享数据模型
    然后,视图将通过指定部分名称或提供要打开视图的枚举来检查Viewbag以获取有关其将加载哪个部分的信息。 然后,partial会将viewbag中的项目强制转换为特定类型

    好处:

    • 允许重用父视图
    • 模型的差异被放在不同的部分
    缺点:

    • 视图必须选择要加载的正确零件
    • Partial必须强制转换为其已知类型

    潜在解决方案3:使用标记接口

    • CreateUserPageModel
      • 共享数据模型
      • ILegacyUserDataModel
      • 部分名称
    视图基于传递的模型加载分部,然后将ILegacyUserDataModel传递给分部。然后,该部分将转换为它设计的任何模型

    好处:

    • 允许重用父视图
    • 模型的差异被放在不同的部分
    缺点:

    • 必须传递PartialName,因此必须在控制器中选择路径
    • Partial必须从接口转换为它设计的实际类型

    好的,这是如何实际实现的

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

    • CreateLegacyUserAModel
      • SharedUserModel模型(此模型上有用于验证的数据注释)
      • LegacyUserAModel(此模型上有数据注释以供验证)
    • CreateLegacyUserCModel
    然后是意见:

    • CreateLegacyView(使用CreateLegacyUserAModel,处理表单的创建)
      • SharedUserFieldView(使用SharedUserModel)
      • LegacyUserFieldsView(使用LegacyUserAModel)
    我们几乎颠覆了视图/模型

    缺点

    • 需要每个CRUD操作的视图和特定模型(4*n显示模型)
    • 每个CRUD操作一个帖子(老实说,这对我来说不是一个真正的骗局)
    专业人士

    • 无需在任何地方强制转换任何模型,视图中无需强制转换,POST操作中无需强制转换

    鉴于你的含糊不清,很难说清楚。视图应为模型的强类型。如果您有不同的模型,您应该有不同的视图。但是,始终可以有一个包含所有视图的viewmodel。当然,您可以拥有所有视图模型都继承自的基类,然后使用EditorTemplates呈现特定类型。然而,所有这些都有各种各样的问题需要处理。是的,我为我头脑风暴的内容添加了我自己的答案。他们符合你的建议,你是对的,他们每个人都有自己的问题:(我真的不喜欢使用标记界面的想法,这感觉很糟糕。另外,在提交表单时,这需要一个自定义模型绑定器来选择正确的模型,有效地确定要再次转换到什么。拥有一个需要为每个新的遗留系统编辑的共享模型似乎是一个糟糕的模式。必须有一个w可以在添加遗留系统dAlso时保持遗留系统a到c的模型不变,在提交表单时,这将需要一个自定义模型绑定器,该绑定器将选择正确的模型,有效地确定要再次转换的对象。