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?
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? –
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
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