复选框列表值不绑定ASP.NET Core MVC中的View GET Request

时间:2017-11-04 17:41:00

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

在我的ViewModel中,我有以下两个列表(一个用于显示表单中的所有可用类别,另一个用于仅用户选择的类别值):

public List<CategoryViewModel> Categories{ get; set; }
public List<string> SelectedCategoryValues { get; set; }

在我的视图中,我在其中一个表单中包含以下内容:

@foreach (var category in Model.Categories) {
     <div class="checkbox">
          <label><input type="checkbox" name="SelectedCategoryValues" 
          value="@category.Value">@category.Name</label>
     </div>
}

提交表单时,模型绑定器正确绑定SelectedCategoryValues列表。

但是,加载页面时,所选复选框不会自动选择。

以下代码位于我的编辑GET操作中:

    var vm = new ProductEditViewModel()
    {
        Id = product.Id,
        Name = product.Name,
        Categories = new List<CategoryViewModel>()
        {
            new CategoryViewModel() { Name = "Category 1", Value = "category1" },
            new CategoryViewModel() { Name = "Category 2", Value = "category2" },
            new CategoryViewModel() { Name = "Category 3", Value = "category3" }
        },
        SelectedCategoryValues = productCategories.Select(c => c.Value).ToList()
    };

    return View(vm);

1 个答案:

答案 0 :(得分:1)

您需要在bool IsSelected{get;set;}中添加CategoryViewModel之类的内容,并在控制器中指定值。

var vm = new ProductEditViewModel()
{
    Id = product.Id,
    Name = product.Name,
    Categories = new List<CategoryViewModel>()
    {
        new CategoryViewModel() { Name = "Category 1", Value = "category1",
         IsSelected = productCategories.Where(c => c.Value == "category1").Count() > 0 ? true : false},
         //do the same
        //new CategoryViewModel() { Name = "Category 2", Value = "category2" },
        //new CategoryViewModel() { Name = "Category 3", Value = "category3" }
    },
    //not required
    //SelectedCategoryValues = productCategories.Select(c => c.Value).ToList()
};

return View(vm);

在视图中

@foreach (var category in Model.Categories) {
     <div class="checkbox">
          <label><input type="checkbox" checked="@category.IsSelected" name="SelectedCategoryValues" 
          value="@category.Value">@category.Name</label>
     </div>
}