ASP.NET MVC-复选框列表未返回所有逗号分隔的值

时间:2018-11-22 13:00:39

标签: asp.net-mvc checkboxlist

我有以下复选框列表:

<input type="checkbox" name="Categories" value="1" />
<input type="checkbox" name="Categories" value="2" />

我的模型如下:

public class MyModel
{
  public string Categories { get; set; }

}

我的控制器:

 public ActionResult Index(MyModel model)
 {
    if (ModelState.IsValid)
    {

        // Save data to database, and redirect to Success page.

        return RedirectToAction("Success");
    }

 }

同时选中两个复选框只能保存一个值吗?

2 个答案:

答案 0 :(得分:1)

您不能将逗号分隔的值直接发送到服务器,我建议按如下所示更改类

public class MyModel
{
   public List<string> Categories { get; set; }

}

您将获得选中复选框的值列表。

如果要用逗号分隔值,则在客户端需要在提交表单创建功能时保存在隐藏变量中。

这可以帮助您

谢谢

答案 1 :(得分:0)

主要问题是string属性存储单个字符串,您应该使用collection属性绑定复选框,例如List<string>如@Ajay所述。

因此,您应该使用以下设置:

模型

public class MyModel
{
    public MyModel()
    {
        SelectedCategories = new List<string>();

        // put categories here
        Categories = new List<SelectListItem>() { ... };
    }

    // other properties

    public List<string> SelectedCategories { get; set; }
    public List<SelectListItem> Categories { get; set; }
}

查看

@foreach (var item in Model.Categories)
{
    <input type="checkbox" name="SelectedCategories" value="@item.Value" ... />
}

控制器

[HttpPost]
public ActionResult Index(MyModel model)
{
    if (ModelState.IsValid)
    {
        // create comma-separated values
        var selectedCategories = string.Join(",", model.SelectedCategories);

        // Save data to database, and redirect to Success page.

        return RedirectToAction("Success");
    }
}

如果要使用CheckBoxFor助手,请使用具有SelectListItem类型的Selected属性的bool,因为CheckBoxFor绑定了bool属性:

模型

public class MyModel
{
    public MyModel()
    {
        // put categories here
        Categories = new List<SelectListItem>() { ... };
    }

    // other properties
    public List<SelectListItem> Categories { get; set; }
}

查看

@for (var i = 0; i < Model.Categories.Count; i++)
{
    @Html.CheckBoxFor(model => model.Categories[i].Selected)
    @Html.HiddenFor(model => model.Categories[i].Text)
    @Html.HiddenFor(model => model.Categories[i].Value)
}

控制器

[HttpPost]
public ActionResult Index(MyModel model)
{
    if (ModelState.IsValid)
    {
        string selectedCategories = string.Join(",", 
                                    model.Categories.Where(x => x.Selected == true)
                                                    .Select(x => x.Text).ToList());

        // Save data to database, and redirect to Success page.

        return RedirectToAction("Success");
    }
}

注意:

有一个名为CheckBoxListFor的自定义帮助程序,应该考虑使用它来从List<T>属性创建复选框列表。

可以在here中看到复选框列表实现的示例。

相关问题:

Get comma-separated string from CheckboxList HTML Helper

Get Multiple Selected checkboxes in MVC