使用列表时如何在 foreach 中使用 CheckBoxFor? [复制]
Posted
技术标签:
【中文标题】使用列表时如何在 foreach 中使用 CheckBoxFor? [复制]【英文标题】:How do I use a CheckBoxFor inside a foreach when working with a list? [duplicate] 【发布时间】:2016-04-13 22:30:01 【问题描述】:我正在练习这个项目,我需要向用户显示客户列表和每个客户的复选框,以便他可以选择一些然后单击按钮。
我成功地制作了列表,我可以看到列表中每一行都有一个复选框。
问题是:
我不知道如何使每个复选框与列表中的每个项目相关...目前它们就像整个列表的单个复选框一样工作。
我对 C# 很陌生,也许我只是在这里做一些愚蠢的事情,所以你能帮我解决这个问题吗?
另外,我将如何迭代列表以检查选择了哪些?
这是我的代码:
我的视图模型:
public class TransferViewModel
public TransferViewModel()
Clients = new List<Client>();
public virtual ICollection<Client> Clients get; set;
[DisplayName("ID")]
public int? Id get; set;
[DisplayName("Transferir de")]
public string TransferFrom get; set;
[DisplayName("Transferir para")]
public string TransferTo get; set;
[DisplayName("Selecionado")]
public bool IsSelected get; set;
[DisplayName("Categoria do Cliente")]
public virtual ClientCategory Category get; set;
[DisplayName("Categoria do Cliente")]
public int? CategoryId get; set;
[DisplayName("Razão Social")]
public string OfficialName get; set;
[DisplayName("Nome Fantasia")]
public string DisplayName get; set;
[DisplayName("Responsável")]
public string AssignedToLogin get; set;
[DisplayName("Excluído")]
public bool IsDeleted get; set;
[DisplayName("Ultima atividade")]
public DateTime? LastInteractionOn get; set;
我的控制器:
[ViewBagListOfUsers]
// GET: ActivityTypes/Create
public ActionResult TransferSpecificClients(TransferViewModel model)
var selectedUserFrom = model.TransferFrom;
var selectedUserTo = model.TransferTo;
var query = db.Clients as IQueryable<Client>;
if (selectedUserFrom!=null)
model.Clients = query
.Where(p => p.AssignedToLogin == selectedUserFrom)
.ToArray();
if ((selectedUserTo != null)&&(selectedUserFrom != null))
//do something if the client is selected ...
return View( model);
我的看法:
@model EFGEREN.App.Models.ViewModels.Clients.TransferViewModel
@using EFGEREN.App.Models.Entities
@using System.Linq
@using System.Web.Mvc
@using Resources
@
ViewBag.Title = "TransferSpecificClients";
IEnumerable<SelectListItem> usersListFrom = ViewBag.UserList;
IEnumerable<SelectListItem> usersListTo = ViewBag.UserList;
<h2>TransferSpecificClients</h2>
@using (html.BeginForm())
@Html.DisplayNameFor(model => model.TransferFrom)
@Html.DropDownListFor(m => m.TransferFrom, usersListFrom, Expressions.DropDownListSelectOneX, new @class = "form-control" )
<div class="controls well well-sm">
<button type="submit" value="Filtrar" class="btn btn-success"><i class="glyphicon glyphicon-ok"></i>@("Filtrar")</button>
</div>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.IsSelected)
</th>
<th>
@Html.DisplayNameFor(model => model.CategoryId)
</th>
<th>
@Html.DisplayNameFor(model => model.OfficialName)
</th>
<th>
@Html.DisplayNameFor(model => model.DisplayName)
</th>
<th>
@Html.DisplayNameFor(model => model.AssignedToLogin)
</th>
<th>
@Html.DisplayNameFor(model => model.LastInteractionOn)
</th>
<th></th>
</tr>
@foreach (var item in Model.Clients)
<tr>
<td>
@Html.CheckBoxFor(m => m.IsSelected, new @checked = "checked" )
</td>
<td>
@Html.DisplayFor(modelItem => item.CategoryId)
</td>
<td>
@Html.DisplayFor(modelItem => item.OfficialName)
</td>
<td>
@Html.DisplayFor(modelItem => item.DisplayName)
</td>
<td>
@Html.DisplayFor(modelItem => item.AssignedToLogin)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastInteractionOn)
</td>
</tr>
</table>
@Html.DisplayNameFor(model => model.TransferTo)
@Html.DropDownListFor(m => m.TransferTo, usersListTo, Expressions.DropDownListSelectOneX, new @class = "form-control" )
<div class="controls well well-sm">
<button type="submit" value="Transferir" class="btn btn-success"><i class="glyphicon glyphicon-ok"></i>@("Transferir")</button>
</div>
【问题讨论】:
您不能使用foreach
循环(请参阅骗子)。并删除您的 `new @checked = "checked" ` 代码。 CheckBoxFor()
方法根据属性的值确定它是否被选中。
【参考方案1】:
SF上有一些关于如何绑定集合的内容,但基本上你应该在你的视图上使用这样的结构:
@foreach (var item in Model.Clients)
// Create a value to be used as index of your elements
var guid = @Guid.NewGuid().ToString();
// Define the prefix of each element from this point
ViewData.TemplateInfo.HtmlFieldPrefix = "Clientes[" + guid + "]";
<tr>
<td>
<input type='hidden' name='Clientes.Index' value='@guid'>
@Html.CheckBoxFor(m => m.IsSelected, new @checked = "checked" )
</td>
</tr>
有关模型绑定如何与集合一起使用的模式详细信息:
http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/
要检查在服务器端检查了哪些元素,您应该使用 LINQ,因为您已经在使用:
var clientes = model.Clientes.Select(x => x.IsSelected == true).ToList();
希望对你有帮助。
【讨论】:
谢谢罗德里戈。你的回答对我帮助很大。问题是我弄乱了我的视图模型,并且对整个客户列表使用了一个布尔属性。我刚刚更正了我的模型(使其成为:bool + Clients 的列表),现在它可以工作了。 在 Razor 视图的 foreach 中,m => m.
lambda 似乎只绑定到模型,而不是循环中的项目
在 Razor 视图的 foreach 中,m => m.
lambda 似乎只绑定到模型,而不是循环中的项目
我的问题正是道格拉斯的问题。你如何将它绑定到循环中的项目?以上是关于使用列表时如何在 foreach 中使用 CheckBoxFor? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 foreach 循环在列表中的短语之间添加分隔符?
同一列表中的多个 ForEach 与具有一个 ForEach 的多个列表