2016-05-05 13 views
0

これは実際には非常に単純な状況ですが、私はこの作業をどうやって行うのか分かりません。したがって、PartialViewにレンダリングされたチェックボックスのリストがあります。親からのデータがViewModelから子のViewModel PartialViewに渡されました。これらはフォームで包まれていますが、残念ながら私はPartialViewからデータを取得できません。
親のViewModel:
どのようにPartialViewからコントローラにアイテムのリストを投稿しますか?

public class UserProgramsViewModel 
    { 
     public int Id { get; set; } 
     [Required(ErrorMessage = "Введите название")] 
     [DisplayName("Название")] 
     public string ProgramName { get; set; } 
     [DisplayName("Пользователь")] 
     public string UserName { get; set; } 
     [DisplayName("Пользователь")] 
     public int UserId { get; set; } 
     [DisplayName("Дни Программы")] 
     public ICollection<ProgramDaysDTO> ProgramDays { get; set; } 
     public IEnumerable<DaysViewModel> Days { get; set;} //Passed to Partial 
    } 

子供のViewModel:

public class DaysViewModel 
    { 
     public int Id { get; set; } 
     public string DayName { get; set; } 
    } 

親ビュー:

@Html.Partial("Days", Model.Days) 

PartialView(ここでは、我々はそれをバインドするには '日' 属性名を使用しています親モデル)

@model IEnumerable<BBN.Admin.ViewModels.DaysViewModel> 
<ul class="list-group col-lg-2"> 
    @foreach (var item in Model) 
    { 
     <li class="list-group-item"><input type="checkbox" name="Days" value="@item.Id" /> @item.DayName</li> 
    } 
</ul> 

コントローラー:

 [HttpPost] 
     [RBAC] 
     public async Task<ActionResult> Create(UserProgramsViewModel model) 
     { 
      var groups = await _us.GetAll(); 
      ViewBag.Users = groups.Select(x => new SelectListItem 
      { 
       Text = x.Login, 
       Value = x.Id.ToString() 
      }); 
      var dto = new UserProgramsDTO 
      { 
       ProgramName = model.ProgramName, 
       UserId = model.UserId, 
       Days = model.Days 
      }; 
      var result = await _ps.Create(dto); 
      if (result.IsSuccess == (BLL.Utilities.Enums.IsSuccess)Enums.IsSuccess.Success) return RedirectToAction("Index"); 
      else return View("Create"); 
     } 
+1

「Days」はcomです複雑なオブジェクトにチェックボックスをバインドすることはできません。また、foreachループを使ってコレクションのフォームコントロールを生成することもできません。ビューモデルと[this answer]に似た 'for'ループが必要です(http://stackoverflow.com/questions/29542107/pass-list-of-checkboxes-into-view-and-pull-out-ienumerable/ 29554416#29554416) –

+0

みんな、アイデアをありがとう、私はいくつかのソリューションを試してみましょう。 –

答えて

0

FormCollectionを使用できます。入力のname属性にitem.DayNameを割り当てます

PartialView(フラグメント):

<li class="list-group-item"> 
     <input type="checkbox" name="@(item.DayName)Days" @if (item.Id > 0) { <text>checked</text> } /> @item.DayName 
</li> 

その後FormCollectionパラメータを処理し、それをモデルのDaysプロパティを記入すると、ヘルプです:

コントローラー:

[HttpPost] 
[RBAC] 
public async Task<ActionResult> Create(UserProgramsViewModel model, FormCollection formCollection) 
{ 
    model.Days = new List<DaysViewModel>(); 
    foreach(var key in formCollection.AllKeys.Where(x => x.Contains("Days"))) 
     model.Days.Add(new DaysViewModel { Id = formCollection[key] == "on" ? 1 : 0, DayName = key.Replace("Days", "")}); 

    //other stuff... 
} 
0

では、コントローラからあなたの親ビューで "日" の値を設定することがありますか?以下のような は、あなたの親ビュー名は、あなたが

public ActionResult Parent() 
{ 
    UserProgramsViewModel loUser = new UserProgramsViewModel(); 
     //Assign Your values here 

    View(loUser); 
} 

だからあなたがここにnull値を取得することはありませんすることができ、このように書くべき「親」であると仮定します。

関連する問題