DropDownListFor()没有从ViewModel中填充预选项

本文关键字:填充 选项 ViewModel DropDownListFor | 更新日期: 2023-09-27 18:15:51

在我的项目中,DropDownListFor(x => x)代码位于EditorTemplate中。它用于填充数据表,其中一个字段是下拉列表。虽然所有的渲染都没有问题,但下拉列表并不默认为我在ViewModel中设置的预选项。我没看到什么?

代码如下:

ViewModel:

public class FooDetailViewModel : ViewModelBase
{
    public List<FooPermissionObject> FooPermissions { get; set; }
}
强类型模型对象:
public class FooPermissionObject
{
    public string Name { get; set; }
    public int Reason { get; set; }
    public IEnumerable<SelectListItem> Reasons { get; set; }
    public bool Selected { get; set; }
}

控制器:

var viewModel = new StockLineManagementDetailViewModel();
using (_model)
{
    foreach (var company in _model.GetAllRecords<Company>())
    {
        var permissionModel = new FooPermissionObject
        {
            Name = company.Name,
            Selected = true,
            Reasons = _model.GetAllRecords<FooPermissionReason>()
                    .ToList()
                    .Select(x => new SelectListItem
                    {
                        Value = x.FooPermissionReasonId.ToString(),
                        Text = x.FooPermissionReasonDesc
                    }),
            Reason = record.FooPermissionReasonId
        };
        viewModel.FooPermissions.Add(permissionModel);
   }
}

The View:

<table id="myTable" class="tablesorter" style="width:98%">
    <thead>
         <tr>
        <th>
            Name
        </th>
        <th>
            Excluded
        </th>
        <th>
            Reason for Exclusion
        </th>
       </tr>
    </thead>
    <tbody>
        @Html.EditorFor(x => x.FooPermissions)
    </tbody>
</table>

EditorTemplate:

@model FooPermissionObject
<tr>
    <td>
        @Html.DisplayFor(x => x.Name, new { @readonly = "readonly"})
        @Html.HiddenFor(x => x.Name)
    </td>
    <td>
        @Html.CheckBoxFor(x => x.Selected)
    </td>
    <td>
        @Html.DropDownListFor(x => x.Reason, Model.Reasons)
    </td>
</tr>

有人知道为什么这不会用来自Reason集合的Reason值表示的对象填充DropDownListFor吗?

DropDownListFor()没有从ViewModel中填充预选项

我看不到你在选择列表中设置selected = true的任何代码。您正在设置FooPermissionObject的Selected属性,但这与您的下拉列表绑定到原因集合无关。您需要这样的内容:

.Select(x => new SelectListItem
{
    Value = x.FooPermissionReasonId.ToString(),
    Text = x.FooPermissionReasonDesc,
    Selected = (Some codition or other)
})

将某些条件或其他条件替换为应该选择哪个项目的任何标准。

编辑:

一个更好的方法可能如下:

Reasons = new SelectList(_model.GetAllRecords<FooPermissionReason>(),
                         "FooPermissionReasonId",
                         "FooPermissionReasonDesc",
                         record.FooPermissionReasonId)

SelectList的构造函数的参数是:要绑定的集合,值字段,文本字段,选定值

已编辑另一种方法(现在是一种方法)是在需要时在投影到SelectListItem -List时设置Selected属性。

关于这个主题的好文章可以在那里找到:http://codeclimber.net.nz/archive/2009/08/10/how-to-create-a-dropdownlist-with-asp.net-mvc.aspx