【问题标题】:DropDownListFor() not populating with preselected item from ViewModel? [duplicate]DropDownListFor() 没有填充来自 ViewModel 的预选项目? [复制]
【发布时间】:2011-11-24 13:36:12
【问题描述】:

在我的项目中,DropDownListFor(x => x 代码位于 EditorTemplate 中。它用于填充数据表,该表的字段之一是下拉列表。虽然一切都在渲染没有问题,但下拉列表不默认为我在 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);
   }
}

观点:

<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>

编辑器模板:

@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>

有人知道为什么这不会用由 Reasons 集合中的 Reason 值表示的 Object 填充 DropDownListFor 吗?

【问题讨论】:

    标签: c# .net asp.net-mvc-3 razor


    【解决方案1】:

    我在选择列表中看不到您设置 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 的构造函数的参数是:要绑定的集合、值字段、文本字段、选定值。

    【讨论】:

    • 据我所知(这很可能是错误的)将 Html 助手设置为 Html.DropDownListFor(x => x.Reason, Model.Reasons) 自动将选定项绑定为原因字段?
    • 是的,用户选择的值将是在您的模型中为原因属性设置的值,但这与预先选择项目无关。
    • 哦,真的吗?因此,即使遵循 dasheddot 的建议也行不通,因为我仍然只设置用户选择某些内容时绑定的字段?
    • 他的第一个建议行不通,他的“另一种方式”是我的建议。还有另一种方法我会更新。
    • 是的,喜欢它。这很好用而且简洁。
    【解决方案2】:

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

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

    【讨论】:

    • 关于投影的 SelectListItem 的迭代点。我试试看。
    • 如果您需要进一步的帮助,请告诉我
    • 代码的第一位无法编译原因是一个 int,你不能将它设置为一个 IEnumerable。
    • 你是对的.. 似乎我过于仓促了 ;-)
    猜你喜欢
    • 2016-01-20
    • 2020-02-19
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多