2012-02-17 19 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にフォームを送信するとき、カスタムデータ型のプロパティはすべてnullです。 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

クラスを教えてください。また、別々のViewModelを使用することを検討してください。おそらく問題を解決するでしょう。 – SLaks

答えて

1

あなたの問題は、あなたが複雑なタイプにHiddenForを使用していることです。これは単純な型のレンダリング方法しか知らない。

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する必要があり、あなたが被保険者を再取得することができ、そこからの永続化

、それがポストバック上のアドレスをです。代理店と同じです。

+0

ちょうどMManの答えに追加するには、もし私があなただったら、モデルバインディングを読んで、なぜ値が通っていないのかを知ることができます。 –

+0

私はMVC3 Futuresを正しくインストールするのをやめましたが、HiddenForをq​​uoteIDだけにトリミングしたときに機能するようになりました。 – Marc

+0

@Marc - MVC先物はNuGet経由で2回クリックするだけです。おそらくもっと簡単なことはできません。 –

関連する問題