【问题标题】:Checkboxlist MVC Partial复选框列表 MVC 部分
【发布时间】:2017-10-02 20:43:18
【问题描述】:

我有以下视图模型代码:

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>
    }

查看:

@model Web.ViewModels.TestCheckboxlistParentModel

@{
    ViewBag.Title = "TestCheckboxlist";
    Layout = "~/Views/Shared/_LayoutApplicationDriver.cshtml";
}

@using (Html.BeginForm())
{

    @Html.Partial("TestPartialCheckboxlist", Model.CBL, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "CBL" } })
    <div class="form-group text-center">
        <input type="submit" class="btn btn-primary" value="Submit" />
    </div>
}

问题是 SelectedFruits 在 post 方法中始终没有任何元素。如果我不使用嵌套的局部视图,相同的代码可以正常工作。属性 TextField 与 Partial 一起工作正常

PS。这不是How to make Check Box List in ASP.Net MVC 问题的重复。这个问题是我回答的基础。就我而言,我需要在部分视图中有复选框列表,但它不起作用!

【问题讨论】:

  • 看起来你已经从这个问题stackoverflow.com/a/37779070/6535663 中得到了帮助。在输入/复选框的部分视图中,将名称更改为SelectedFruits&lt;input type="checkbox" name="SelectedFruits" value="@item.Value" /&gt; @item.Text &lt;/label&gt;
  • 将部分放在视图的 Edit 文件夹中,并在主视图上调用 editor-for 模板。我的猜测是,由于您只呈现部分而不是编辑模板,因此视图不会像应有的那样将父信息添加到 ID。
  • 这是一种创建复选框列表的奇怪方法。建议您参考this answer中的代码
  • @DavidLee,这不是重复的

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-partialview


【解决方案1】:

您使用name="@Html.IdFor(p =&gt; p.SelectedFruits)" 生成name="CBL_SelectedFruits",但为了绑定到您的模型,您需要name="CBL.SelectedFruits"(注意. 点,而不是_ 下划线),您可以使用它生成

name="@Html.NameFor(p => p.SelectedFruits)"

但是,您的代码还有其他问题。您没有强烈绑定到您的模型,您没有得到验证,您在不需要时为属性AvailableFruits 生成IList&lt;SelectListItem&gt;(它可能只是IList&lt;string&gt; 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; }
}

在 GET 方法中

ParentVM model = new ParentVM
{
    Fruits = new List<FruitVM>{ 
        new FruitVM{ Name = "Apple" },
        new FruitVM{ Name = "Pear" }, 
        ....       
    }
};
return View(model);

并为FruitVM 创建一个EditorTemplate - 在/Views/Shared/EditorTemplates/FruitVM.cshtml

@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" />
}

EditorFor() 方法将为您的集合中的每个项目生成正确的 html。

然后在POST方法中,就可以用

[HttpPost]
public ActionResult TestCheckboxlist(ParentVM model)
{
    ....
    List<string> selectedFruits = model.Fruits.Where(x => x.IsSelected);

【讨论】:

  • 太棒了!谢谢你的解释!最后我在 ASP.NET MVC 中为复选框列表提供了一个很好且灵活的解决方案,没有粗略的硬编码等。
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2012-06-27
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多