有没有办法在子模型列表的上下文中绑定DropDownListFor
的值?
目前,如果我有一个父模型,其中包含循环的子模型列表,DropDownListFor HtmlHelper
将不会绑定该值。
我在dotnetfiddle上创建了一个案例来解释这个问题:https://dotnetfiddle.net/RB4UVc
这是这里复制的小提琴中的代码:
Model.cs
using System;
using System.Web.Mvc;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace HelloWorldMvcApp
{
public class Model
{
public int? SelectedValue { get; set; }
public List<Value> Values { get; set; }
public IEnumerable<SelectListItem> Fields
{
get
{
return new[]
{
new SelectListItem { Text = "1", Value = "1" },
new SelectListItem { Text = "2", Value = "2" },
new SelectListItem { Text = "3", Value = "3" }
};
}
}
public Model()
{
Values = new List<Value>();
}
}
public class Value
{
public int SelectedValue { get; set; }
public string Name { get; set; }
}
}
HomeController.cs
using System;
using System.Web.Mvc;
using System.Collections.Generic;
namespace HelloWorldMvcApp
{
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
var model = new Model();
model.SelectedValue = 2;
model.Values.Add(new Value { SelectedValue = 3, Name = "John Doe" });
return View(model);
}
}
}
Index.cshtml
@model HelloWorldMvcApp.Model
<h1>Single</h1>
<p>Value: @Model.SelectedValue</p>
@Html.DropDownListFor(model => model.SelectedValue, Model.Fields)
<hr>
<h1>Collection</h1>
@foreach(var value in Model.Values)
{
<p>Value: @value.SelectedValue</p>
<p>Name: @Html.TextBoxFor(_ => value.Name)</p>
@Html.DropDownListFor(_ => value.SelectedValue, Model.Fields)
}
<hr>
<h1>Indexed Collection</h1>
@for(var i = 0; i < Model.Values.Count(); i++)
{
<p>Value: @Model.Values[i].SelectedValue</p>
<p>Name: @Html.TextBoxFor(model => model.Values[i].Name)</p>
@Html.DropDownListFor(model => model.Values[i].SelectedValue, Model.Fields)
}
第一种是使用正确绑定的正常值,第二种是使用子模型的集合。我们可以看到,TextBoxFor
能够正确绑定值。
我在这里做错了什么或是否有解决此问题的方法? (除了手动构建<select>
元素)
旁注:我在循环的上下文中专门考虑这个问题,因为我需要批量保存一组子模型。
答案 0 :(得分:0)
首先,您不需要手动递增值以获取集合循环中的当前索引。你可以把它写成'for'循环而不是像'foreach'那样:
@for(int i = 0; i < Model.Values.Count(); i++)
{
<p>Value: @Model.Values[i].SelectedValue</p>
<p>Name: @Html.TextBoxFor(model => model.Values[i].Name)</p>
@Html.DropDownListFor(model => model.Values[i].SelectedValue, Model.Fields)
}
(请注意,我没有测试过该代码。)
其次,SelectListItem对象中有一个'Selected'布尔值。尝试将页面加载时要选择的对象设置为true。