2012-02-17 69 views
2

我在创建HttpGet页面时模型有效,但在HttpPost上无效(某些属性为null)时出现问题。MVC3 ModelState在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 - 在这一点上,该模型是有效的。被保险人和代理人的资产已填充,并且其各自的地址属性也已填充。

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

     return View(model); 
    } 

而且HTTPPORT的ActionResult - 在这种方法的进入,被保险人,代理销售和它们各自的地址属性为null,造成无效模式状态。

[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; } 
    } 
+0

请向我们展示课程。另外,请考虑使用单独的ViewModels;那可能会解决这个问题。 – SLaks 2012-02-17 18:09:44

回答

1

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

我会建议要么只是坚持这些对象的ID或使用MVC Futures项目的帮助器函数来序列化您的帐户和被保险对象,然后在您的控制器中反序列化它们。

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

坚持的ID的应该只是在InsuredID,从中你可以重新获得被保险人,并在回发的地址。与Agency相同。

+0

只需添加到MMan的答案,如果我是你,我会阅读模型绑定,以便更好地了解为什么值不会通过。 – 2012-02-17 23:55:07

+0

我放弃了试图正确安装MVC3 Futures,但是当我将HiddenFor修剪为quoteID时,我能够正常工作。 – Marc 2012-02-20 21:26:48

+0

@Marc - MVC期货是两次点击通过NuGet安装。它不可能更容易。 – 2012-02-20 22:06:06

相关问题