将 DropDownListFor 与 ViewModel 上的列表绑定
Bind DropDownListFor with List on 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.
}
我得到了每个 select 正确呈现,但我无法在页面加载时得到正确的选项 select:
render of view
有可能做我想做的事情但我做错了什么,或者 DropDownListFor 以不同的方式工作?
谢谢!
我不明白为什么会这样,但您可以通过明确设置所选值来解决此问题。这可以通过将 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 来生成索引输入;因此生成的输入控件将生成名称为 "GradeList[0].CurrencyId"、"GradeList[1].CurrencyId"...... 由于此框架无法绑定 Select 列表中的选定值,因为它无法获取选择的反思价值。这就是为什么您必须使用以下 SelectList 构造函数来设置所选值的原因。
public SelectList(
IEnumerable items,
string dataValueField,
string dataTextField,
object selectedValue
)
但是,如果您的 DropDownListFor 绑定到像
这样的简单表达式
@Html.DropDownListFor(model => model.CurrencyId, new SelectList(ViewBag.Items, "Value", "Text"))
然后选择将自动工作。
我正在尝试这样做:
这是我的视图模型和模型:
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.
}
我得到了每个 select 正确呈现,但我无法在页面加载时得到正确的选项 select: render of view
有可能做我想做的事情但我做错了什么,或者 DropDownListFor 以不同的方式工作?
谢谢!
我不明白为什么会这样,但您可以通过明确设置所选值来解决此问题。这可以通过将 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 来生成索引输入;因此生成的输入控件将生成名称为 "GradeList[0].CurrencyId"、"GradeList[1].CurrencyId"...... 由于此框架无法绑定 Select 列表中的选定值,因为它无法获取选择的反思价值。这就是为什么您必须使用以下 SelectList 构造函数来设置所选值的原因。
public SelectList(
IEnumerable items,
string dataValueField,
string dataTextField,
object selectedValue
)
但是,如果您的 DropDownListFor 绑定到像
这样的简单表达式@Html.DropDownListFor(model => model.CurrencyId, new SelectList(ViewBag.Items, "Value", "Text"))
然后选择将自动工作。