Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复选框列表MVC部分_C#_Asp.net Mvc_Asp.net Mvc 4_Asp.net Mvc Partialview - Fatal编程技术网

C# 复选框列表MVC部分

C# 复选框列表MVC部分,c#,asp.net-mvc,asp.net-mvc-4,asp.net-mvc-partialview,C#,Asp.net Mvc,Asp.net Mvc 4,Asp.net Mvc Partialview,我有以下视图模型代码: public class TestCheckboxlistParentModel { public TestCheckboxlistParentModel() { CBL = new TestCheckboxlistModel(); } public TestCheckboxlistModel CBL { get; set; } } public class TestCheckboxlistModel { publ

我有以下视图模型代码:

public class TestCheckboxlistParentModel
{
    public TestCheckboxlistParentModel()
    {
        CBL = new TestCheckboxlistModel();
    }
    public TestCheckboxlistModel CBL { get; set; }
}

public class TestCheckboxlistModel
{
    public string TextField { get; set; }
    public IList<string> SelectedFruits { get; set; }
    public IList<SelectListItem> AvailableFruits { get; set; }

    public TestCheckboxlistModel()
    {
        SelectedFruits = new List<string>();
        AvailableFruits = new List<SelectListItem>();
    }
}
控制器:

    public ActionResult TestCheckboxlist()
    {
        var model = new TestCheckboxlistParentModel
        {
            CBL = new TestCheckboxlistModel()
            {
                AvailableFruits = GetFruits()
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult TestCheckboxlist(TestCheckboxlistParentModel model)
    {
        if (ModelState.IsValid)
        {
            // Save data to database, and redirect to Success page.

            return RedirectToAction("Success");
        }
        //model.AvailableFruits = GetFruits();
        return View(model);
    }

    public ActionResult Success()
    {
        return View();
    }

    private IList<SelectListItem> GetFruits()
    {
        return new List<SelectListItem>
    {
        new SelectListItem {Text = "Apple", Value = "1"},
        new SelectListItem {Text = "Pear", Value = "2"},
        new SelectListItem {Text = "Banana", Value = "3"},
        new SelectListItem {Text = "Orange", Value = "4"},
        };
    }
局部视图:

@model Web.ViewModels.TestCheckboxlistModel

<div class="form-group">
    @Html.LabelFor(model => model.TextField)
    <div class="col-md-10">
        @Html.EditorFor(model => model.TextField)
    </div>
</div>

    @foreach (var item in Model.AvailableFruits)
    {
<div class="checkbox">
    <label>
        <input type="checkbox"
               name="@Html.IdFor(p=>p.SelectedFruits)"
               value="@item.Value" /> @item.Text
        </label>
    </div>
    }
视图:

问题是SelectedFruits在post方法中始终没有任何元素。如果我不使用嵌套的局部视图,同样的代码也可以正常工作。属性TextField可以很好地处理部分

另外,这不是一个复杂的问题。这个问题是我回答的基础。在我的例子中,我需要在局部视图中有一个复选框列表,它不工作

您可以使用name=@Html.IdForp=>p.SelectedFruits生成name=CBL\u SelectedFruits,但是为了绑定到您的模型,您需要name=CBL.SelectedFruits注意。点,而不是可以使用

name="@Html.NameFor(p => p.SelectedFruits)"
但是,您的代码还有其他问题。您没有强绑定到您的模型,您没有得到任何验证,您在不需要时为属性AvailableFruits生成IList它可能只是IList AvailableFruits,最重要的是,如果您返回视图,用户选中的所有复选框都将丢失所有复选框都将被取消选中

更改视图模型,以便可以强绑定到属性

public class FruitVM
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}
public class ParentVM
{
    public string TextField { get; set; }
    public List<FruitVM> Fruits { get; set; }
}
在我看来

@Html.ParentVM
....
@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.TextField)
    @Html.EditorFor(m => m.TextField)

    @Html.EditorFor(m => m.Fruits)

    <input type="Submit" value="Save" />
}

可能的重复项看起来您已从该问题中获得帮助。在输入/复选框的局部视图中,将名称更改为SelectedFruits@Text将分部放在视图的编辑文件夹中,并调用主视图上的模板编辑器。我的猜测是,由于您只呈现部分而不是编辑模板,视图没有像应该的那样将父信息添加到ID中。这是一种创建复选框列表的奇怪方式。建议您参考@davidele中的代码,这不是一个可疑的例外!谢谢你的解释!最后,我在ASP.NETMVC中为复选框列表提供了一个良好而灵活的解决方案,没有粗糙的硬编码内容等。
ParentVM model = new ParentVM
{
    Fruits = new List<FruitVM>{ 
        new FruitVM{ Name = "Apple" },
        new FruitVM{ Name = "Pear" }, 
        ....       
    }
};
return View(model);
@model FruitVM
@Html.CheckBoxFor(m => m.IsSelected)
@Html.LabelFor(m => m.IsSelected, Model.Name)
@Html.ParentVM
....
@using (Html.BeginForm())
{
    @Html.LabelFor(m => m.TextField)
    @Html.EditorFor(m => m.TextField)

    @Html.EditorFor(m => m.Fruits)

    <input type="Submit" value="Save" />
}
[HttpPost]
public ActionResult TestCheckboxlist(ParentVM model)
{
    ....
    List<string> selectedFruits = model.Fruits.Where(x => x.IsSelected);