将多个值绑定到单个复选框并将其发布到控制器
本文关键字:控制器 单个 绑定 复选框 | 更新日期: 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="" />
您将在行动后中获得所有这些