【问题标题】:MVC3 ModelState invalid on HttpPostHttpPost 上的 MVC3 ModelState 无效
【发布时间】:2012-03-09 03:27:36
【问题描述】:

我遇到了一个问题,即模型在创建 HttpGet 页面时有效,但在 HttpPost 上无效(某些属性为空)。

这是我打开页面的调用:

            var quote = new Quote
            {
                Agency = assignedAgency,
                Insured = insured,
                RiskAddress = insured.Address
            };
            db.Quotes.Add(quote);
            db.SaveChanges();

            return RedirectToAction("Edit", "Quote", quote.QuoteID);  

还有 HttpGet ActionResult - 此时,模型是有效的。 Insured 和 Agency 属性已填充,并且它们各自的 Address 属性也已填充。

    [HttpGet]
    public ActionResult Edit(int quoteID)
    {
        var model = db.Quotes.Find(quoteID);

       return View(model);
    }

还有 HttpPort ActionResult - 在这个方法的入口处,Insured、Agency 及其各自的 Address 属性为空,导致 Model 状态无效。

    [HttpPost]
    public ActionResult Edit(Quote model)
    {
        if (ModelState.IsValid)
        {
            if (model.SubCosts > 0)
            {
                model.InsuredSubs = true;
                model.SubClassCode = "95626 - Subcontractor - TEST CLASS";
                model.SubClassExposure = model.SubCosts;
            }

            db.Entry(model).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Edit", new { quoteID = model.QuoteID });
        }
        return View(model);
    }

还有 HTML:

 @model DomaniOnline.Models.DomaniData.Quote

 @{
     ViewBag.Title = "Classification";
  }

  <h2>General Liability Classification</h2>

  @using (Html.BeginForm())
   {
     @Html.ValidationSummary(true)
     <fieldset>

    @Html.HiddenFor(model => model.QuoteID)
    @Html.HiddenFor(model => model.Insured)
    @Html.HiddenFor(model => model.Insured.Address)
    @Html.HiddenFor(model => model.RiskAddress)
    @Html.HiddenFor(model => model.Agency)
    @Html.HiddenFor(model => model.Agency.Address)

        .
        .
        .
        .
    <p>
        @Html.ActionLink("Back to Insured Info", "Edit", "Insured", new { insuredID = Model.Insured.InsuredID }, null)
        <input type="submit" value="Save & Continue" />
    </p>
</fieldset>
}

我想指出,页面底部的“返回被保险人信息”ActionLink 工作正常,并且能够提供正确的 model.Insured.InsuredID。但是由于某种原因,在将表单提交到 HttpPost 时,任何属于自定义数据类型的属性都为空。 Html.HiddenFor 在尝试使其正常工作时被添加为测试。

编辑:类:

 public class Quote
 {
    public virtual int QuoteID { get; set; }
    public virtual Address RiskAddress { get; set; }
    public virtual Agency Agency { get; set; }
    public virtual Insured Insured { get; set; }

    public virtual DateTime PropEffDate { get; set; }
    public virtual bool InsuredSubs { get; set; }
    public virtual int SubCosts { get; set; }
    .
    .
    .
  }
  public class Address
  {
    [Required]
    public virtual string StreetAddress { get; set; }
    [Required]
    public virtual string City { get; set; }
    [Required]
    public virtual string State { get; set; }
    [Required]
    public virtual string ZipCode { get; set; }
  }
  public class Insured
  {
    public virtual int InsuredID { get; set; }
    [Required]
    public virtual string Name { get; set; }
    [Required]
    public virtual Address Address { get; set; }
    public virtual string DBA { get; set; }
    [Required]
    public virtual string BusinessType { get; set; }
    public virtual string Phone { get; set; }
  }

【问题讨论】:

  • 请向我们展示课程。另外,考虑使用单独的 ViewModel;这可能会解决问题。

标签: asp.net-mvc-3


【解决方案1】:

您的问题是您在复杂类型上使用HiddenFor。这只知道如何渲染简单类型。

我建议要么只保留这些对象的 ID,要么使用 MVC Futures 项目中的 Html.Serialize 辅助函数来序列化您的帐户和受保对象,然后在您的控制器中反序列化它们。

http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx

保留 ID 应该只是 InsuredID,您可以从中重新获取被保险人及其回发地址。代理机构也是如此。

【讨论】:

  • 只是添加到 MMan 答案中,如果我是你,我会阅读模型绑定,以便你更好地了解为什么值没有通过。
  • 我放弃了尝试正确安装 MVC3 Futures,但是当我将 HiddenFor 缩减为仅 quoteID 时,我能够让事情正常工作。
  • @Marc - MVC 期货只需单击两次即可通过 NuGet 安装。再简单不过了。
  • 噢!从未安装过 NuGet,正在尝试安装 Futures 的老式手动方法。傻我。
  • @Marc - 如果你没有 NuGet,这意味着你也没有使用 SP1,你真的应该安装 SP1,然后更新到最新的 NuGet。
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2018-04-10
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多