在ASP.NET MVC 2中使用SelectList挣扎

时间:2010-02-15 08:43:30

标签: c# asp.net-mvc asp.net-mvc-2 viewmodel scaffolding

我的模型看起来像这样:

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),我会收到错误,“没有为此对象定义无参数构造函数。”这可能是因为ColorsSelectList,并且SelectList没有无参数构造函数,因此无法完成绑定。

所以,我想我明白了问题是什么,但是我真的可以为这个场景使用一个很好的解决方案,当你拥有带有外键的模型对象时,它似乎会出现很多。

有些问题:

  1. 如何让Colors显示为编辑视图的菜单,但在详细信息视图中只显示一个简单的字符串值(例如“绿色”)?
  2. 如何在更新包含SelectList的模型时阻止“无参数构造函数”错误?
  3. 如果我的Model / ViewModel实际上包含一个外键ColorId,而不是Colors,那么获取详细信息视图以显示当前颜色的名称和编辑的最佳做法是什么?查看以显示包含我的数据库的Color表中列出的所有颜色名称的菜单。如果有帮助,我正在使用LinqToSql(SqlMetal)来生成我的模型类。

1 个答案:

答案 0 :(得分:3)

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

  1. 创建3个单独的模型类:一个“域”模型,由您的LinqToSql对象(或它们周围的包装器)和两个视图模型组成,一个用于Details视图,另一个用于Edit视图。

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

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

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

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