【问题标题】:MVC4 Html.DropDownListFor is not selecting specified valueMVC4 Html.DropDownListFor 未选择指定值
【发布时间】:2013-10-21 02:34:31
【问题描述】:

我有以下课程:

public class PreviewImage_Edit
{
    ...
    public List<GridDetail_Edit> GridDetails { get; set; }
    public SelectList GridDetailTypesList { get; set; }
    ...
}

public class GridDetail_Edit
{
    ...
    public int GridDetailTypeId { get; set; }
    ...
}

而且,我有一个局部视图,它需要一个 PreviewImage_Edit 类型的模型,它具有以下代码块:

@model PreviewImage_Edit
...
@if (Model.GridDetails != null)
{
    for (var i = 0; i < Model.GridDetails.Count(); i++)
    {
        ...
        @Html.DropDownListFor(model => model.GridDetails[i].GridDetailTypeId, Model.GridDetailTypesList)
        ...
    }
}

我在 GridDetail_Edit 中正确创建了 SelectList,并且下拉列表按预期填充。下面是为第一个 GridDetails 对象生成的标记:

<select data-val="true" data-val-number="The field GridDetailTypeId must be a number." data-val-required="The GridDetailTypeId field is required." id="GridDetails_0__GridDetailTypeId" name="GridDetails[0].GridDetailTypeId">
    <option value="1">Top</option>
    <option value="2">Bottom</option>
</select>

当单击“保存”按钮时,我已验证所选选项已正确保存在数据库中(即使所选选项不是下拉列表中的第一个/默认选项)。但是,当我返回重新编辑时,所选选项仍然是下拉列表中的第一个选项。

我单步执行了代码并验证了数据是否已从数据库中正确检索。我什至已经将 Html.DropDownListFor 转换为 Html.EditorFor 并确认存储在数据库中的值正在按预期进入视图。

当与之关联的属性是整数值时,我使用过 Html.DropDownListFor,但当它是作为对象集合的一部分的整数值时,我从未使用过。到目前为止,我会担心自己所做的一切,但一切似乎都在解决这个关键问题。

到目前为止,我已经尝试将 PreviewImage_Edit 中的 SelectList 移动到 GridDetail_Edit 中,并在我以编程方式为适当的 SelectedListItem 设置“Selected”值的地方分别初始化它们。那没有用...同样的结果。

有人遇到过这个问题吗?有关解决此问题的最佳方法的任何建议?


更新

下面是填充 GridDetailTypesList 的代码的 sn-p

var gridDetailTypes = _db.GridDetailTypes.OrderBy(g => g.DisplayOrder).ToList();
return new SelectList(gridDetailTypes, "GridDetailTypeId", "Name");

这很简单。 SelectList 构造函数的第二个参数表示应该在“value”属性中使用其值的字段。我不认为这个问题与 value 字段是一个整数这一事实有关,因为我在同一页面上有类似的代码并且下拉菜单运行正常。唯一的区别是我的“问题”下拉列表在我的 ViewModel 的集合中。

【问题讨论】:

  • 你能在向 GridDetailsTypeList 中插入项目的地方添加代码的 sn-p 吗?它可能与此有关(GridDetailTypeId 的值是 int,而 SelectListItems 的值是字符串)

标签: asp.net-mvc-4 html.dropdownlistfor selectedvalue


【解决方案1】:

我唯一一次在下拉列表中看到有关“必须是数字”的消息是我搞砸了,当我从数据库加载 OPTION 时,它们的(数字)值被空格填充。这似乎不是您的问题(您的示例特别显示没有填充),但我肯定想查看 GridDetails[0].GridDetailTypeId 的值以确保它的类型/值正确。

希望我可以将其添加为评论而不是答案 - 但我的代表还不够高......

【讨论】:

    【解决方案2】:

    它对我有用的唯一方法是当我的 List 是一个简单的IEnumerable&lt;string&gt; 时,或者当我将 DataText 的自定义对象的相同属性作为 DataValue 传递时。如下:

    Html.DropDownListFor(m => m.TypeOfFilter, new SelectList(Model.Filters, "DataText", "DataText")
    

    其中 TypeOfFilter 是一个枚举,Model.Filters 是一个List&lt;MySelectItemModel&gt;。 这样您就可以在生成的 HTML 中看到选择了正确的选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多