gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:34:53 26 4
gpt4 key购买 nike

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

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 为我的详细信息 View 使用 Html.DisplayForModel() 并为我的编辑 View 使用 Html.EditorForModel() 自动构建属性。

结果:

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

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

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

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

一些问题:

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

最佳答案

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

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

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

  3. Edit View 模型应包含所选颜色 ID 的属性。它还应包含可用颜色选项的选择列表,所选值设置为当前所选 ID。

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

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

关于c# - 在 ASP.NET MVC 2 中使用 SelectList 挣扎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2264763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com