C# MVC:POST控制器方法获取空字典
获取控制器构造和填充模型的方法,包括C# MVC:POST控制器方法获取空字典,c#,asp.net-mvc,dictionary,asp.net-mvc-5,C#,Asp.net Mvc,Dictionary,Asp.net Mvc 5,获取控制器构造和填充模型的方法,包括字典,并将其传输到视图。但之后,POST控制器方法使用空字典获取非空模型 型号: public class CheckBoxItem { public string Name { get; set; } public double Data { get; set; } public bool Selected { get; set; } } public class CreateNewEventModel {
字典
,并将其传输到视图。但之后,POST控制器方法使用空字典获取非空模型
型号:
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>();
}
}
查看:
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);
}
@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" />
}
}
@model HLyaa.Models.CreateNewEventModel
@{
ViewBag.Title=“创建事件”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
Создание события
@if(Model.CheckBoxDataItems.Count()!=0)
{
使用(Html.BeginForm(“CreateEvent”、“Events”、FormMethod.Post))
{
@Html.ValidationSummary()
@LabelFor(model=>model.EventName)
@EditorFor(model=>model.EventName)
@foreach(Model.CheckBoxDataItems中的var kvpair)
{
@Html.CheckBoxFor(model=>model.CheckBoxDataItems[kvpair.Key]。选中)
@DisplayFor(model=>model.CheckBoxDataItems[kvpair.Key].Name)
@Html.HiddenFor(model=>model.CheckBoxDataItems[kvpair.Key]。选中)
@Html.HiddenFor(model=>model.CheckBoxDataItems[kvpair.Key].Name)
@Html.TextBoxFor(model=>model.CheckBoxDataItems[kvpair.Key].Data,新{@type=“number”})
}
}
}
如何将字典中的数据从视图传输到控制器?字典否,列表/数组是,但您必须进行一些修改 修改模型
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>();
}
}
更新视图
<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>
@对于(var i=0;imodel.CheckBoxDataItems[i]。选中)
@DisplayFor(model=>model.CheckBoxDataItems[i].Name)
@Html.HiddenFor(model=>model.CheckBoxDataItems[i].UserId)
@Html.HiddenFor(model=>model.CheckBoxDataItems[i]。选中)
@Html.HiddenFor(model=>model.CheckBoxDataItems[i].Name)
@Html.TextBoxFor(model=>model.CheckBoxDataItems[i]。数据,新{@type=“number”})
}
CheckBoxDataItems
现在应该在您将其发布到控制器时填充它Yes。你是对的!这真的很有效。然而,我不明白为什么字典是空的,但列表不是空的。请您解释一下我可以在模型中使用哪些类型?这与您如何在视图中引用模型属性有关。当您使用foreach
时,视图将不会为列表生成html,该列表将在发布时转换回列表。当引用像saymodel.CheckBoxDataItems[i].Name这样的索引时,视图将生成像Name=“CheckBoxDataItems[0].Name“
这样的名称,该名称在发布时将正确转换回列表。框架试图解释发送的表单数据并将其转换为强类型对象。请查看本文。谢谢你帮助我
<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>