Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC:POST控制器方法获取空字典_C#_Asp.net Mvc_Dictionary_Asp.net Mvc 5 - Fatal编程技术网

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,该列表将在发布时转换回列表。当引用像say
model.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>