2016-04-13 11 views
1

私は、クライアントのリストと各クライアントのチェックボックスをユーザに提示して、いくつかのボタンを選択してボタンをクリックする必要があるこのプロジェクトで練習しています。リストを操作するときに、CheckBoxForをforeach内で使用するにはどうすればよいですか?

私はリストを作成することができました。リスト内のすべての行に対して1つのチェックボックスが表示されます。

問題がある:

私は私のリストの各項目に関連する各チェックボックスを作成する方法がわからない...現在、彼らは全体のリストについては、単一のチェックボックスのように取り組んでいます。

私はC#の初心者です。多分私はここで何かばかげたことをしています。

また、リストを選択してチェックするためにリストを反復する方法はありますか?ここで

When debugging I see the checkbox as a single element, not one for each item in my list

私のコードです:

私のViewModel:

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

'foreach'ループは使用できません(dupeを参照)。 'new {@checked =" checked "}"コードを削除してください。 'CheckBoxFor()'メソッドは、プロパティの値に基づいて選択されたものを判定します。 –

答えて

2

は、コレクションをバインドする方法について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(); 

希望します。

+0

ありがとう、ロドリゴ。あなたの答えは私を大いに助けました。問題は、私がviewmodelを混乱させ、単一のboolプロパティをクライアントのリスト全体に使用していることでした。私はちょうど私のモデルを修正しました(bool + Clientsのリストにしました)。 –

+0

私はお手伝いします –

関連する問題