2016-09-28 6 views
0

私の最後のquestionと私が得た答えに基づいて、私はそれらについて考えていたし、私のアプリケーションで本当の問題は何だったのですか。そして、皆さんがそこに書いたすべてのことを理解する助けになったと思います。本当に感謝しています。だから私は私の問題を示すために、小さいながらも作業例を作った:ASP.NET MVC:複数のviewModelを使用し、モデルに正しいデータを渡す方法は?

マイモデル:

public class Order 
    { 
     public int OrderID { get; set; } 
     public string NameOfCustomer { get; set; } 
     public string Address { get; set; } 
    } 

私が必要2他のviewmodels含まのViewModel:

public class ViewModelOrder 
    { 
     public ViewModelSendItNow viewModelSenditNow { get; set; } 
     public ViewModelSafeForLater viewModelSafeForLater { get; set; } 
    } 

のViewModel SendItNow:

public class ViewModelSendItNow 
    { 
     [Required] 
     public string NameOfCustomer { get; set; } 
     [Required] 
     public string Address { get; set; } 
    } 

ViewModel SafeForLater:

public class ViewModelSafeForLater 
    { 
     public string NameOfCustomer { get; set; } 
     public string Address { get; set; } 
    } 

ビュー:

@model ProblemExample.Models.ViewModelOrder 

@{ 
    ViewBag.Title = "CreateOrder"; 
} 

<h2>CreateOrder</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

     @if (Request.Form["SafeForLater"] != null) 
     { 
      @Html.TextBoxFor(m => m.viewModelSafeForLater.NameOfCustomer) 
      @Html.TextBoxFor(m => m.viewModelSafeForLater.Address) 
     } 

     else 
     { 
      @Html.TextBoxFor(m => m.viewModelSenditNow.NameOfCustomer) 
      @Html.TextBoxFor(m => m.viewModelSenditNow.Address) 
     } 
     <hr /> 
     <button class="formular-button-submit" type="submit" name="SenditNow">Send it now!</button> 
     <button class="formular-button-submit" type="submit" name="SafeForLater">Safe it for later!</button> 
    </div> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

コントローラ:だから

public ActionResult CreateOrder() 
     { 
      ViewModelOrder viewModel = new ViewModelOrder(); 
      return View(viewModel); 
     } 

     [HttpPost] 
     public ActionResult CreateOrder(ViewModelOrder viewModel) 
     { 
      if (Request.Form["SafeForLater"] != null) 
      { 
       Order myOrder = new Order() 
       { 
        NameOfCustomer = viewModel.viewModelSafeForLater.NameOfCustomer, 
        Address = viewModel.viewModelSafeForLater.Address 
       }; 
       db.Orders.Add(myOrder); 
       db.SaveChanges(); 
      } 

      else 
      { 
       Order myOrder = new Order() 
       { 
        NameOfCustomer = viewModel.viewModelSenditNow.NameOfCustomer, 
        Address = viewModel.viewModelSenditNow.Address 
       }; 
       db.Orders.Add(myOrder); 
       db.SaveChanges(); 
      } 
      return View(viewModel); 
     } 

、ユーザーがフォームが表示されるはずですし、彼は今、それを送信することを決定したとき、検証が彼にしている場合ジャンプしなければなりません後でそれを保存したい場合、検証は行われません。なぜ私はビューの2つのボタンでそれをしようとします。問題は、今すぐ送信するためのサンプルが送信され、必要なようにデータベースに保存されますが、後でSafeを押すと、Nullreference例外が発生し、なぜそれほど理由がわかりません。だから多分あなたは私のコードで間違いを見て、私がこれを解決する方法や私が試みることができるヒントを教えてくれます。

よろしく、

+0

コードは意味をなさないでしょう。ビューが最初にレンダリングされると、常に 'else'ブロックにヒットし、' viewModelSenditNow'のためのフォームコントロールを生成します(検証は常に開始されます)。 POSTメソッドでは、 'Request'Form [" SafeForLater "]'は 'submit'ボタンに' value'属性がなく、値を返信しないので常に 'null'になります。とにかく、なぜあなたはビューを返すのですか? –

+0

@StephenMueckeあなたの答えをありがとう。言葉で言えば、これを解決しようとしますか?コンセプトの観点から私が完全に逃したことが何かそのようなことをしていますか? – RawMVC

+0

あなたは何をしたいのかを説明するのに十分な情報を与えていませんが、 'bool SaveAsDraft'プロパティを含む単一のビューモデルを使用し、[foolproof](http://foolproof.codeplex.com /) '[RequiredIfFalse(" SaveAsDraft ")]'を他のプロパティに追加します(おそらく、submitでのみ検証するために '$ validator'を再設定します)。そして、ユーザーが有効ではないドラフトを保存したい場合は、@ Html.CheckBoxFor(m => m.SaveAsDraft)によって生成されたチェックボックスをチェックすることができます。 –

答えて

0

ページのロードが、これだけ2つのテキストボックスがある時にレンダリングされます、Request.Form["SafeForLater"]が空であることが表示されますので、今それを送信するときにのみ、2テキストボックスを描画するため、答えは単純ですしたがって、コードはelseブロックに移動し、今すぐ送信するテキストボックスのみをレンダリングします。

両方を表示し、CSSを使用して非表示/表示するだけです。 あなたのコードは次のようになります。

@model ProblemExample.Models.ViewModelOrder 

@{ 
    ViewBag.Title = "CreateOrder"; 
} 

<h2>CreateOrder</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

     @if (Request.Form["SafeForLater"] != null) 
     { 
      @Html.TextBoxFor(m => m.viewModelSafeForLater.NameOfCustomer) 
      @Html.TextBoxFor(m => m.viewModelSafeForLater.Address) 
      <div style="display:none"> 
       @Html.TextBoxFor(m => m.viewModelSenditNow.NameOfCustomer) 
       @Html.TextBoxFor(m => m.viewModelSenditNow.Address) 
      </div> 
     } 

     else 
     { 
      <div style="display:none"> 
       @Html.TextBoxFor(m => m.viewModelSafeForLater.NameOfCustomer) 
       @Html.TextBoxFor(m => m.viewModelSafeForLater.Address) 
      </div> 

      @Html.TextBoxFor(m => m.viewModelSenditNow.NameOfCustomer) 
      @Html.TextBoxFor(m => m.viewModelSenditNow.Address) 
     } 
     <hr /> 
     <button class="formular-button-submit" type="submit" name="SenditNow">Send it now!</button> 
     <button class="formular-button-submit" type="submit" name="SafeForLater">Safe it for later!</button> 
    </div> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

こんにちは@Haitham Shaddad、 あなたの答えをお寄せいただきありがとうございます。Nullreferenceでエラーを解決しましたが、Safe It for Laterの値はデータベースに保存されず、nullになります。 – RawMVC

+0

デバッグしましたか?アクションの値を調べますか?値がコントローラアクション内のモデルにバインドされていることを確認できますか?データバインディングの問題であるかデータベースの問題であるかを知るだけです –

+0

ステップのデバッグ後にステップを実行しましたが、値がモデルにバインドされていないように見えます。 – RawMVC

関連する問題