3

我有一个看起来像这样的模型:

public class SampleModel
{
    public static SampleModel Create()
    {
        return new SampleModel
        {
            Boolean = true,
            // set several more properties...
            Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green")
        };
    }

    public bool Boolean { get; set; }
    // define several more properties...
    public SelectList Colors { get; set; }
}

我让 ASP.NET MVC 自动构建Html.DisplayForModel()用于我的详细信息视图和Html.EditorForModel()编辑视图的属性。

结果:

  • 编辑视图效果很好。Colors显示为包含三个项目(红色、绿色和蓝色)的菜单,默认选择绿色。

  • 但是,对于详细信息视图,我得到“False True False”,这显然是IsSelected菜单中每个项目的值的列表。那绝对不是我想要的。我希望它只显示“绿色”。

  • 另一个问题是,如果我尝试UpdateModel(sampleModel)在控制器中执行此操作,则会收到错误消息“没有为此对象定义无参数构造函数”。这大概是因为Colors是 a SelectList,并且 没有无参构造函数SelectList,所以无法完成绑定。

所以,我想我理解问题所在,但我真的可以为这种情况使用一个很好的解决方案,当你有带有外键的模型对象时,这似乎出现了很多。

一些问题:

  1. 如何Colors在“编辑”视图中显示为菜单,但在“详细信息”视图中仅显示为简单的字符串值(例如,“Green”)?
  2. 更新包含 的模型时,如何防止“无参数构造函数”错误SelectList
  3. 如果我的 Model/ViewModel 实际上包含一个外键,ColorId而不是Colors,那么让 Details 视图显示当前颜色的名称以及让 Edit 视图显示包含Color我的数据库表。如果有帮助,我将使用 LinqToSql (SqlMetal) 来生成我的模型类。
4

1 回答 1

3

您的问题都源于您将 SelectList 公开为模型属性的事实。根据具体情况,我可能会做类似的事情:

  1. 创建 3 个单独的模型类:一个由 LinqToSql 对象(或围绕它们的包装器)组成的“域”模型和两个视图模型,一个用于详细信息视图,一个用于编辑视图。

  2. Details 视图模型应包含当前选择的颜色名称。Details 操作将设置此属性,或者使用域对象中的 FK 关系,或者通过手动查找所选颜色的详细信息。

  3. 编辑视图模型应包含所选颜色 ID 的属性。它还应该包含一个可用颜色选项的选择列表,其中选定的值设置为当前选定的 ID。

  4. 处理表单发布的 Edit 操作应该接受 Edit 视图模型的实例,并且应该将这些更改映射到域模型上。由于所选颜色是一个简单的属性,而不是一个选择列表,因此很容易验证并映射回业务对象。

如果您的情况非常简单,您可能能够为 View 和 Edit 使用单个视图模型,甚至可以将域对象直接传递给 Details 视图。在任何情况下,只要您从模型中删除 SelectList 并将所选颜色作为简单 ID 公开,那么您应该没问题。

于 2010-02-15T13:59:52.740 回答