【问题标题】:Bind DropDownListFor with List on ViewModel将 DropDownListFor 与 ViewModel 上的列表绑定
【发布时间】:2015-10-24 18:27:48
【问题描述】:

我正在尝试这样做:

这是我的 ViewModel 和模型:

public class OpeningYearViewModel
{
    public int OpeningYearId { get; set; }
    public string Description { get; set; }
    public List<Grade> GradesList { get; set; }
}

public class Grade
{
    public int GradeId { get; set; }
    public string Name { get; set; }
    public int CurrencyId { get; set; }
    public int Cost { get; set; }
}

这是我的控制器。我在这里建立了一个SelecList 并通过ViewBag 将其传递给视图

OpeningYearViewModel viewmodel = new OpeningYearViewModel {

    OpeningYearId = 1,
    Description = "2015 - II",
    GradesList = new List<Grade>
    {
        new Grade { GradeId = 1, Name = "Grade 1", CurrencyId = 1, Cost = 100 },
        new Grade { GradeId = 2, Name = "Grade 2", CurrencyId = 2, Cost = 200 },
        new Grade { GradeId = 3, Name = "Grade 3", CurrencyId = 2, Cost = 150 }
    }
};

SelectList list = new SelectList(
                    new List<SelectListItem> 
                    {
                        new SelectListItem { Text = "S/.", Value = "1"},
                        new SelectListItem { Text = "$", Value = "2"},
                     }, "Value" , "Text");

ViewBag.currencyList = list;

return View(viewmodel);

在我看来,我需要为 GradesList 上的每个项目创建一个 DropDownListFor,所以我这样做:

@model Test.Models.OpeningYearViewModel

@for(int i = 0; i < Model.GradesList.Count; i++)
{
  @Html.DropDownListFor(x => x.GradesList[i].CurrencyId, new SelectList(ViewBag.currencyList, "Value", "Text"))
  @Model.GradesList[i].CurrencyId //This is just to know the CurrencyId on every item.
}

我正在正确呈现每个选择,但我无法在页面加载时选择正确的选项: render of view

有可能做我想做的事但我做错了什么,或者 DropDownListFor 以不同的方式工作?

谢谢!

【问题讨论】:

  • 这是在循环中使用DropDownListFor() 的不幸限制(在 CodePlex 上已报告过几次)。请注意,在您的代码中,您首先创建List&lt;SelectListItem&gt;,然后从中创建一个相同的IEnumerable&lt;SelectListItem&gt;(这就是SelectList),然后您第三次在客户端上再次执行所有操作(这样做有点毫无意义3次)​​
  • @StephenMuecke 好电话。我对 MVC 有点陌生,所以我正在关注一个(糟糕的)教程。现在我正在处理对象列表,然后在视图上创建 SelectList。谢谢。

标签: c# asp.net-mvc html.dropdownlistfor viewbag asp.net-mvc-viewmodel


【解决方案1】:

我不明白为什么会发生这种情况,但您可以通过明确设置所选值来解决此问题。这可以通过将Model.GradesList[i].CurrencyId 作为第四个参数传递给SelectList 的构造函数来完成:

@for(int i = 0; i < Model.GradesList.Count; i++)
{
    @Html.DropDownListFor(x => x.GradesList[i].CurrencyId, 
        new SelectList(ViewBag.currencyList, "Value", "Text", Model.GradesList[i].CurrencyId))
}

【讨论】:

  • 成功了。谢谢!看来 DropDownListFor 对我的情况有点限制。
【解决方案2】:

因此,DropDownListFor 在循环中用于生成索引输入;因此生成的输入控件将生成名称为“GradeList[0].CurrencyId”、“GradeList[1].CurrencyId”......由于此框架无法绑定选择列表中的选定值,因为它无法在反射中获得值以供选择。这就是为什么您必须使用以下 SelectList 构造函数来设置选定值的原因。

public SelectList(
    IEnumerable items,
    string dataValueField,
    string dataTextField,
    object selectedValue
)

但是,如果您的 DropDownListFor 绑定到像

这样的简单表达式
@Html.DropDownListFor(model => model.CurrencyId, new SelectList(ViewBag.Items, "Value", "Text"))

然后选择将自动进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多