【问题标题】:Struggling with SelectList in ASP.NET MVC 2在 ASP.NET MVC 2 中与 SelectList 斗争
【发布时间】:2011-01-16 21:51:39
【问题描述】:

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

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是一个SelectList,而SelectList没有无参构造函数,所以无法完成绑定。

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

一些问题:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 确实,单独的 Edit 和 View 模型确实会产生具有许多相同属性的类对,但它也使得修改一个视图而不影响另一个视图变得非常容易。与我的 DTO 相比,我对保持逻辑 DRY 更加警惕。您也可以从另一个视图模型派生一个视图模型,但除非您的视图非常简单,否则这可能比它的价值更麻烦。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2018-05-23
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多