使用列表时如何在 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 =&gt; m. lambda 似乎只绑定到模型,而不是循环中的项目 在 Razor 视图的 foreach 中,m =&gt; m. lambda 似乎只绑定到模型,而不是循环中的项目 我的问题正是道格拉斯的问题。你如何将它绑定到循环中的项目?

以上是关于使用列表时如何在 foreach 中使用 CheckBoxFor? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 foreach 循环在列表中的短语之间添加分隔符?

如何使用 forEach 删除列表中的元素?

如何使用 codeigniter 动态创建列

同一列表中的多个 ForEach 与具有一个 ForEach 的多个列表

在 ForEach 循环中绑定时,如何阻止 SwiftUI TextField 失去焦点?

如何在没有 foreach 的情况下将项目从列表复制到列表?