【问题标题】:Structure for a view with an optional secondary model in MVC3MVC3 中具有可选辅助模型的视图的结构
【发布时间】:2012-02-06 22:28:05
【问题描述】:

我正在处理一个 MVC3 项目,该项目有一个带有关联强类型视图模型的视图。我的任务是向该视图添加一个可选部分,该部分将包含第二个模型的数据,其中大约一半与第一个模型共享。

我的问题是,实现这一点的最佳方法是什么?我是否应该将可选模型表示的对象添加到视图模型并尝试从那里映射值?

如果我这样做,如何将编辑器与两个模型关联?

【问题讨论】:

    标签: asp.net-mvc-3 model viewmodel


    【解决方案1】:

    将可选模型添加到视图模型是最佳选择,因为与 ViewBag 不同,它是类型安全的,并且您仍然可以利用 html 助手。请记住在渲染第二个模型之前检查它的空引用(因为它是可选的)。 对于共享属性,您的视图模型可以具有特殊的 getter/setter,它们将保持两个模型在内部同步。

    【讨论】:

    • 所以如果我要在 viewModel 上使用成员属性,我必须手动将值分配给它们吗?或者 MVC 活页夹会以某种方式为我做这件事吗?我的另一个问题是如何处理数据库。到目前为止,我已经在数据库中的嵌套模型上添加了一个属性,该属性存储了主模型的 ID,这样我就可以判断是否已经添加了一个,而不是每次都创建一个新条目。这是一种体面的设置方式还是我应该这样做的更好方式?
    • MVC 绑定器只会调用您正在使用的属性的设置器。在这个 setter 中,你可以放置你的代码来更新嵌套模型的值;类似string Name { set { this.firstModel.Name = value; this.secondModel.Name = value; }。虽然这是可能的,但它可能不是最好的设计,所以关于你的第二个问题,如果没有关于这个特定用例的更多信息,我不能说这是否是一种体面的设置方式。或许您可以先提供更多信息,说明为什么需要共享属性。
    • 当然,基本上我正在编写一个数据输入应用程序,用于接收车辆机械问题的信息。问题是,如果车辆因机械问题而错过运行,我需要自动输入错过的运行实例,该实例与机械问题输入表单共享大约一半的字段。因此,与其让他们再次输入一半的信息,我希望能够使用现有信息。
    • 在这种情况下,我认为如果您提取两个对象共有的属性并将它们转换为第三个对象(例如“VehicleOccurrence”或类似的东西),这将是一个更好的设计.然后,您可以让两个对象,“错过运行”和“机械问题”,都参考这个“发生”。使用继承而不是引用也是一种选择,比复制这些属性 IMO 更好。
    【解决方案2】:

    我想我理解您的要求,这就是我过去的实现方式。

    将可选模型作为参数添加到视图模型中,然后创建一个分部视图,该视图键入到该可选模型中。如果满足允许显示该局部视图的条件,则将 viewmodel.optionalmodel 传递给该局部视图。

    您只需要注意参数的重叠会导致任何令人头疼的问题(如在空引用中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多