DropDownListFor在子模型列表的上下文中不绑定值

时间:2017-02-02 16:19:23

标签: c# asp.net-mvc asp.net-mvc-5

有没有办法在子模型列表的上下文中绑定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>元素)

旁注:我在循环的上下文中专门考虑这个问题,因为我需要批量保存一组子模型。

1 个答案:

答案 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。