2016-05-05 7 views
0

Das ist eigentlich eine ganz einfache Situation, aber ich kann nicht verstehen, wie das funktioniert. Also, es gibt eine Liste von Checkboxen, gerendert in PartialView. Daten vom übergeordneten Element übergeben ViewModel an Kind ViewModel in PartialView. All diese eingewickelten Formulare, leider kann ich die Daten nicht von PartialView bekommen.
Eltern Ansichtsmodell:
Wie wird die Liste der Elemente von PartialView auf den Controller übertragen?

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 
    } 

Kind Ansichtsmodell:

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

geordneten Ansicht:

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

PartialView (hier sind wir mit Attributnamen 'Days' es zu binden Elternmodell)

@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> 

Controller:

 [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

'Tage' ist ein com Plex-Objekt und Sie können ein Kontrollkästchen nicht an ein komplexes Objekt binden. Sie können auch keine foreach-Schleife verwenden, um Formularsteuerelemente für eine Sammlung zu generieren. Sie benötigen ein View-Modell und eine 'for'-Schleife, die der [dieser Antwort] ähnelt (http://stackoverflow.com/questions/29542107/pass-list-of-checkboxes-into-view-and-pull-out-ienumerable/ 29554416 # 29554416) –

+0

Jungs, danke für Ideen, lass mich einige Lösungen ausprobieren. –

Antwort

0

Sie können FormCollection verwenden. Namensattribut zuweisen item.DayName zu der Eingabe:

PartialView (Fragment):

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

Dann FormCollection Parameter verarbeiten und Days Eigenschaft des Modells füllen damit Hilfe ist:

Controller:

[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

Haben Sie Werte für "Tage" im übergeordneten Ansicht von der Steuerung eingestellt? für Ihre Eltern Ansicht Name Angenommen wird „Parent“, dann sollten Sie so schreiben,

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

    View(loUser); 
} 

So kann man hier nicht Nullwert erhalten wird.

Verwandte Themen