将多个值绑定到单个复选框并将其发布到控制器

本文关键字:控制器 单个 绑定 复选框 | 更新日期: 2023-09-27 17:53:32

Model.cs

一个活动可以有多个图像,这就是为什么IEnumerable<int> ImageIdList

public class Campaign
{
  public int Id { get; set; }
  public int CreatedBy { get; set; }
  public int UpdatedBy { get; set; }
  public IEnumerable<int> ImageIdList { get; set; }
}

View.cshtml

我想下载所有与活动相关的图像,基于ImageIdList,这就是为什么当选中特定活动并单击下载按钮时,我需要发布所有这些ImageIds

@model Campaign
    @{
      Layout = "....";
      var assets = Model.AssetsInCampaign.ToList();
    }
    @using (Html.BeginForm("action-method", "controller", FormMethod.Post))
    {
      <div class="btnSubmit">
        <input type="submit" value="Download Asset(s)" />
      </div>
      @foreach(var i in assets)
      {
        <div class="s_checkcol">
          <input type="checkbox" name="ids" />
          @foreach (var imageId in i.Where(c => c.AssetId == doc.FileDataId).SelectMany(c => c.ImageIdList))
          {
              <input type="hidden" name="ids" value=@(imageId)>
          }
        </div>
      }
    }

控制器.cs

public ActionResult DownloadFiles(IEnumerable<int> ids)
{
    // code
}

注意:这里只提供了代码的一部分(我面临问题的地方(。这是DB优先的方法,我无法改变(ORDERS(

我尝试了上面的操作,但无论选择了多少复选框,所有的ids都会发布到控制器。

问题:我应该如何将IEnumerable<int> ImageIdList属性绑定到View.cs中的复选框,并将数据发布到Controller.cs,以便只发布所选复选框的ids

将多个值绑定到单个复选框并将其发布到控制器

这是一个很好的练习。。。它会起作用的,我正在和这样一个方式(我确信它会很好地工作(,但有一件事你在编码这个时必须非常小心复杂

我认为这一努力不仅仅是为了回答这个特殊的问题。

它适用于所有stackoverflow用户。因为我从未在stackoverflow的任何软件中找到以下方法。

我通过长时间的搜索得到了这个方法。你们可以使用这个。

它将帮助您避免循环绑定复选框列表

它最适合重新使用(需要一行(最多20-25个字符才能在Razor中绑定CheckBoxList(

CheckBoxListItem.cs

创建一个新的类复选框列表项//您可以使用任何其他名称

public class CheckBoxListItem
{
    public int ID { get; set; }
    public string Display { get; set; }
    public bool IsChecked { get; set; }
}

MyModel.cs

这是型号级

public class MyModel
{
    [Key]        
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<CheckBoxListItem> ChkList { get; set; }
}

HomeController.cs

这是控制器

public ActionResult Index()
{
     var model = new MyModel(){
         Id = 0,
         Name = "Your Name",
         ChkList = dbContext.myTable.Select(x => new CheckBoxListItem { ID = x.MyTableFieldID, Display = x.MyTableFieldName, IsChecked = true })
         //If you need only int part, then just avoid to bind data on Display field
     };
     return View(model);
}
[HttpPost]
public ActionResult Index(MyModel myModel) //Your model object on PostAction
{
    IEnumerable<CheckBoxListItem> ChkList = myModel.ChkList; 
    // Here is your answer, You can see all your check box items (both checked and unchecked) in ChkList, it will shows all your checked items are true and non-checked items are false in IsChecked field 
}

在这里你必须给予更多的空间

转到文件夹查看共享>EditorTemplates并右键单击添加>查看。。。并使用相同的名称创建一个新视图CheckBoxListItem.cshtml

CheckBoxListItem.cshtml

@model Project.Models.CheckBoxListItem
<div class="">
    @Html.HiddenFor(x => x.ID)
    <div class="">
        @Html.CheckBoxFor(x => x.IsChecked)
    </div>
    @Html.LabelFor(x => x.IsChecked, Model.Display, new { @class = "" })
</div>

创建视图

Index.cshtml

@model @model Project.Models.MyModel
<div class="form-group">
    @Html.LabelFor(model => model.Id, htmlAttributes: new { @class = "" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Id, new { htmlAttributes = new { @class = "" } })
        @Html.ValidationMessageFor(model => model.Id, "", new { @class = "" })
    </div>
</div>
@Html.EditorFor(model => model.ChkList) //This only one line of code is enough to bind a checkBoxList in future
<input type="submit" value="Create" class="" />

您将在行动后中获得所有这些