【问题标题】:Bind multiple values to a single checkbox and post it to controller将多个值绑定到单个复选框并将其发布到控制器
【发布时间】:2016-11-02 07:22:49
【问题描述】:

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

Controller.cs

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

注意:这里只提供了一部分代码(我遇到的问题)。它是数据库优先的方法,我无法改变它(ORDERS)。

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

问题:我应该如何将IEnumerable&lt;int&gt; ImageIdList 属性绑定到View.cs 中的复选框并将数据发布到Controller.cs,以便仅发布选定复选框的ids

【问题讨论】:

  • 您认为复选框在哪里?
  • 我的错!已编辑。 @Roma 就在 foreach 循环上方。
  • 可能与此问题相似:stackoverflow.com/questions/12221314/…
  • 您不能将IEnumerable&lt;int&gt; 绑定到复选框。复选框仅回发单个值。它不清楚你想做什么。发布所有 ID 的原因是因为您为每个 ID 创建了一个隐藏输入。你想为你的集合中的每个项目生成一个复选框
  • 我怀疑你想要类似this answer

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


【解决方案1】:

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

我这样做不仅是为了回答这个特定问题。

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

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

它将帮助您避免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

这是模型类

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 
}

这里要多一点耐心

转到文件夹 View>SharedEditorTemplates 并右键单击 Add>View... 并使用同名 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="" />

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多