发布时我的模型中的对象列表为空

Posted

技术标签:

【中文标题】发布时我的模型中的对象列表为空【英文标题】:List of objects is empty in my model when posting 【发布时间】:2022-01-08 12:19:28 【问题描述】:

当我发布我的表单时,我的对象列表总是空的,我不知道为什么。我搜索并阅读了十几个类似的问题,但仍然没有成功。除了 TimeAdds 列表之外,我的模型中的字段都被回发。任何帮助表示赞赏。

我的控制器

    public ActionResult TimeAdd()
    

      TimeAddModel model = new TimeAddModel();
      model.StartDate = DateTime.Now;
      model.EndDate = DateTime.Now;
      model.TypeId = 1;
      model.TimeAdds = new List<TimeAdd>();
      
      return View(model);
    

    [HttpPost]
    public ActionResult TimeAdd(TimeAddModel model)
    
      
      if (Request.Form["dateRange"] != null) 
        ModelState.Clear();
        TimeAdd t = new TimeAdd();
        t.Id = Guid.NewGuid();
        t.TypeId = model.TypeId;
      
        model.TimeAdds.Add(t);
      
      else 
        //save
      

      return View(model);
    

我的班级

  public class TimeAdd
  
    [Key]
    public Guid Id  get; set; 
    public int TypeId  get; set; 

  

我的模特

public class TimeAddModel
  

    public DateTime StartDate  get; set; 
    public DateTime EndDate  get; set; 
    public int TypeId  get; set; 

    public List<TimeAdd> TimeAdds  get; set; 

    public TimeAddModel()
    
      this.TimeAdds = new List<TimeAdd>();
    
  

和我的页面

@model metrosales.Models.TimeAddModel
@using metrosales.Data.TimeOff.Model

<div class="container excess">
  @using (html.BeginForm("TimeAdd", "Service", FormMethod.Post)) 

  <div class="row">
    <div class="col-sm-6">
      @Html.LabelFor(model => model.StartDate)
      @Html.TextBoxFor(x => x.StartDate, "0:yyyy-MM-dd", new  @class = "form-control", @type = "date", @id = "StartDate", @name = "StartDate" )

    </div>
    <div class="col-sm-6">

      @Html.LabelFor(model => model.EndDate)
      @Html.TextBoxFor(x => x.EndDate, "0:yyyy-MM-dd", new  @class = "form-control", @type = "date", @id = "EndDate", @name = "EndDate" )
    </div>
    </div>
    <input type="submit" class="btn text-center" name="dateRange" value="Submit1" />
    <input type="submit" class="btn text-center" name="submit" value="Submit2" />
    

    <div>

      <br />
      <table id="tblExcess" class="table" cellpadding="0" cellspacing="0">
        <tr>

          <th>ID</th>
          <th>Start</th>
        </tr>
        @for (var i = 0; i < Model.TimeAdds.Count(); i++) 
          <tr>
            <td>@Html.HiddenFor(model => model.TimeAdds[i].Id)</td>
            <td>@Html.TextBoxFor(model => model.TimeAdds[i].TypeId)</td>
            
          </tr>
        
       
      </table>
    </div>

【问题讨论】:

【参考方案1】:

为了使 MVC 能够正确执行数据绑定,有必要在 TimeAdd 视图中准备上下文。

因此,要为TimeAdds 列表中的每个项目提供索引,请在TimeAdd.cshtml 中进行以下更改:

@Html.Hidden("TypeId", Model.TypeId)

@for (var i = 0; i < Model.TimeAdds.Count(); i++)

    @Html.Hidden("TimeAdds[" + i + "].Id", Model.TimeAdds[i].Id)
    @Html.Hidden("TimeAdds[" + i + "].TypeId", Model.TimeAdds[i].TypeId)

    <tr>
        <td>@Html.TextBoxFor(model => Model.TimeAdds[i].Id)</td>
        <td>@Html.TextBoxFor(model => Model.TimeAdds[i].TypeId)</td>
    </tr>

【讨论】:

进行了这些更改,但它仍然是空的 @Cooper:你有两个按钮:Submit1Submit2。你到底按下了什么按钮? 这个想法是按下 Submit2 按钮,但两个按钮都发布一个空数组。我尝试删除第二个按钮并获得相同的结果。我只是通过将我的表格移动到仅将列表作为模型的部分视图来使其工作。真的不确定我错过了什么。感谢您的帮助。 @Cooper:你有没有考虑到当你第一次进入TimeAdd(TimeAddModel model)动作方法时TimeAdds列表会是空的?只有下次您输入此方法时,TimeAdds 列表才会包含元素。 是的,第二次它仍然是空的。虽然我仍然很好奇为什么它不工作,但我已经使用部分视图让它工作了,所以我会继续这样做。在我的部分观点中可能与第二种形式有关?无论如何,感谢您的尝试。

以上是关于发布时我的模型中的对象列表为空的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 新手:为啥在创建强类型视图时我的模型不可用?

根据.net核心中var中的条件插入对象列表/自定义模型列表

如何将 django/python 中的模型对象列表序列化为 JSON

Cloudkit 中的即时模式

django中的模型视图集

Asp.net MVC 4 / 5 中的分页