2016-10-08 2 views
1

Ma méthode GET de constructeur de contrôleur et de modèle de remplissage, qui inclut Dictionary<int, MyClass>, et transmet cela à View. Mais après, la méthode du contrôleur POST n'obtient pas de modèle nul avec le dictionnaire vide.MVC: la méthode du contrôleur POST est vide Dictionnaire

Modèle:

public class CheckBoxItem 
    { 
    public string Name { get; set; } 
    public double Data { get; set; } 
    public bool Selected { get; set; } 
    } 
    public class CreateNewEventModel 
    { 
    [Required(ErrorMessage = "Error text")] 
    [Display(Name = "Header name")] 
    public string EventName { get; set; } 
    public Dictionary<int, CheckBoxItem> CheckBoxDataItems { get; set; } 
    public CreateNewEventModel() 
    { 
     CheckBoxDataItems = new Dictionary<int, CheckBoxItem>(); 
    } 
    } 

Controller:

public ActionResult CreateEvent() 
    { 
     CreateNewEventModel model = new CreateNewEventModel(); 
     // FILL MODEL 
     foreach (var user in db.UsersInfo.ToList()) 
     { 
     model.CheckBoxDataItems.Add(user.Id, new CheckBoxItem() 
     { 
      Name = user.Name, 
      Data = 0, 
      Selected = false 
     }); 
     } 
     // THERE IS FULL MODEL 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult CreateEvent(CreateNewEventModel model) 
    { 
     // THERE IS model.Event name include text 
     // BUT model.CheckBoxDataItems is empty 
     if (ModelState.IsValid) 
     { 
     ...  
     return View(model); 
     } 
     return View(model); 
    } 

Vue:

@model HLyaa.Models.CreateNewEventModel 

@{ 
    ViewBag.Title = "Create Event"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Создание события</h2> 

@if (Model.CheckBoxDataItems.Count() != 0) 
{ 
    using (Html.BeginForm("CreateEvent", "Events", FormMethod.Post)) 
    { 
    @Html.ValidationSummary() 
    <div> 
     @Html.LabelFor(model => model.EventName) 
     <div> 
     @Html.EditorFor(model => model.EventName) 
     </div> 
    </div> 
    <table> 
     @foreach (var kvpair in Model.CheckBoxDataItems) 
     { 
     <tr> 
      <td> 
      @Html.CheckBoxFor(model => model.CheckBoxDataItems[kvpair.Key].Selected) 
      </td> 
      <td> 
      @Html.DisplayFor(model => model.CheckBoxDataItems[kvpair.Key].Name) 
      @Html.HiddenFor(model => model.CheckBoxDataItems[kvpair.Key].Selected)    
      @Html.HiddenFor(model => model.CheckBoxDataItems[kvpair.Key].Name)   
      </td> 
      <td> 
      @Html.TextBoxFor(model => model.CheckBoxDataItems[kvpair.Key].Data, new { @type = "number" }) 
      </td> 
     </tr> 
     } 
    </table> 
    <br /> 
    <input type="submit" value="Next" /> 
    } 
} 

Comment je peux transmettre des données à l'intérieur di ctionary de View to Controller?

Répondre

3

Dictionnaire non, liste/tableau oui, mais vous devrez apporter quelques modifications.

modèles Modifier

public class CheckBoxItem { 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public double Data { get; set; } 
    public bool Selected { get; set; } 
} 

public class CreateNewEventModel { 
    [Required(ErrorMessage = "Error text")] 
    [Display(Name = "Header name")] 
    public string EventName { get; set; } 
    public List<CheckBoxItem> CheckBoxDataItems { get; set; } 
    public CreateNewEventModel() { 
     CheckBoxDataItems = new List<CheckBoxItem>(); 
    } 
} 

Modifier la méthode GET CreateEvent

public ActionResult CreateEvent() { 
    var model = new CreateNewEventModel(); 
    //...FILL MODEL 
    foreach (var user in db.UsersInfo.ToList()) { 
     model.CheckBoxDataItems.Add(new CheckBoxItem() { 
      UserId = user.Id, 
      Name = user.Name, 
      Data = 0, 
      Selected = false 
     }); 
    } 
    // THERE IS FULL MODEL 
    return View(model); 
} 

Mise à jour Voir

<table> 
    @for (var i = 0; i < Model.CheckBoxDataItems.Count; i++) { 
    <tr> 
     <td> 
     @Html.CheckBoxFor(model => model.CheckBoxDataItems[i].Selected) 
     </td> 
     <td> 
     @Html.DisplayFor(model => model.CheckBoxDataItems[i].Name) 
     @Html.HiddenFor(model => model.CheckBoxDataItems[i].UserId) 
     @Html.HiddenFor(model => model.CheckBoxDataItems[i].Selected) 
     @Html.HiddenFor(model => model.CheckBoxDataItems[i].Name) 
     </td> 
     <td> 
     @Html.TextBoxFor(model => model.CheckBoxDataItems[i].Data, new { @type = "number" }) 
     </td> 
    </tr> 
    } 
</table> 

CheckBoxDataItems devrait être peuplé maintenant lorsque vous publiez au contrôleur

+0

Y es. Tu as raison! C'est vraiment efficace. Cependant, je ne comprends pas pourquoi Dictionary est vide, mais List ne l'est pas. Pourriez-vous, s'il vous plaît, expliquer quels types je peux utiliser dans le modèle? –

+0

Cela concerne la façon dont vous référencez les propriétés du modèle dans votre vue. lorsque vous utilisez 'foreach', la vue ne génère pas de code html pour la liste qui sera convertie en liste lors de sa publication. en référençant un index comme say 'model.CheckBoxDataItems [i] .Name' la vue va générer un nom comme' name = "CheckBoxDataItems [0] .Name" 'qui sera correctement converti en liste quand il sera publié. – Nkosi

+0

Le travail de cadre tente d'interpréter les données de formulaire envoyées et de les convertir en objets fortement typés. – Nkosi