在ViewModel上使用List绑定DropDownListFor

时间:2015-10-24 18:27:48

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

我试图这样做:

这是我的ViewModel和Model:

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

将其传递给视图
@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.
}

在我的视图中,我需要为GradesList上的每个项目使用DropDownListFor,所以我这样做:

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
    var socket=io();
    $('form').submit(function(){
        var un=$('#un').val();
        var pw=$('#pw').val();
        socket.emit('login',un,pw);
        return false;
    });
</script>

我正确地渲染了每个选项,但我无法在页面加载中选择正确的选项: render of view

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

谢谢!

2 个答案:

答案 0 :(得分:2)

我无法理解为什么会发生这种情况,但您可以通过明确设置所选值来解决此问题。这可以通过将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))
}

答案 1 :(得分:0)

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

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

但是,如果DropDownListFor绑定到像

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

然后选择将自动生效。