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

时间:2016-06-30 09:27:31

标签: c# asp.net-mvc razor checkbox

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。< / p>

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

Controller.cs

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

注意:此处仅提供了部分代码(我遇到问题)。它是数据库的第一种方法,我绝不能改变它(ORDERS)。

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

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

1 个答案:

答案 0 :(得分:1)

  

这是一个很好的做法......它会起作用,而且我会使用这样的方法   方式(我相信它会很好地运作)但是你需要做一件事在编码时非常小心,一点点   复杂

Iam不仅仅是为了回答这个特殊问题。

适用于所有stackoverflow用户。因为我从未在stackoverflow中找到以下方法anyware。

我通过长时间搜索获得此方法。你们可以使用它。

它将帮助您避免for循环绑定Checkboxlist

它对可重用性最好(需要一行(最多:20-25个字符来绑定Razor中的CheckBoxList ))

<强> CheckBoxListItem.cs

  

创建一个新类CheckBoxListItem //您可以使用任何其他名称

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

<强> MyModel.cs

  

这是modelclass

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 
}
  

在这里你必须提供更多的视野

转到文件夹查看&gt; 共享&gt; 编辑器模板并右键单击添加&gt;查看...并创建新视图具有相同名称 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="" />

您将在帖子中获得所有这些