Asp.net mvc 3 HttpPost上的MVC3 ModelState无效

Asp.net mvc 3 HttpPost上的MVC3 ModelState无效,asp.net-mvc-3,Asp.net Mvc 3,我遇到了一个问题,模型在创建HttpGet页面时是有效的,但在HttpPost上是无效的(某些属性为null) 这是我打开页面的电话: var quote = new Quote { Agency = assignedAgency, Insured = insured, RiskAddress = insured.Address

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

这是我打开页面的电话:

            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——在这一点上,模型是有效的。投保财产和代理财产已填充,且其各自的地址财产也已填充

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

       return View(model);
    }
和HttpPort ActionResult—在该方法的输入处,被保险人、代理及其各自的地址属性为空,导致模型状态无效

    [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>
}

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

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


保留ID应该只是被保险人的ID,从中可以在回邮中重新获得被保险人及其地址。代理也一样。

请给我们看一下课程。此外,考虑使用单独的ViewModels;这可能会解决问题。为了补充MMan的答案,如果我是你,我会阅读模型绑定,以便你更好地了解为什么值无法通过。我放弃了正确安装MVC3 Futures的尝试,但是当我把HiddenFor删减到quoteID时,我就可以让它正常工作了。@Marc-MVC futures是通过NuGet安装的两次点击。再容易不过了。啊!从未安装过NuGet,正在尝试安装Futures的老式手动方法。我真傻。@Marc-如果你没有NuGet,这意味着你也没有使用SP1,你真的应该安装SP1,然后更新到最新的NuGet。
 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; }
  }