2012-02-17 54 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

相關問題