2011-12-27 3 views
0

私は単純なASP.NET MVC 3ダミーのアプリケーションを持っています(WebFormsからMVCを学ぶだけです)。DBの永続性を持たないシンプルなフォームの更新

そして、私はかなり間にいくつかのDBのものを持っていないフォームを更新する方法についてかなり混乱しています。私はちょうどテキストボックスを持つフォームを持っていますし、ボタンを押した後に文字列を大文字で見たいと思っています。しかし、私の何も起こりません。

コントローラ:

public ActionResult Index() 
    { 
     ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(ToUppercaseModel model) 
    { 
     model.TheString = model.TheString.ToUpper(); 

     return View(model); 
    } 

モデル:

public class ToUppercaseModel 
{ 
    [Display(Name = "My String")] 
    public string TheString { get; set; } 
} 

およびView:

@using (Html.BeginForm()) { 
    <div> 
     <div class="editor-label"> 
      @Html.LabelFor(m => m.TheString) 
     </div> 
     <div class="editor-field"> 
      @Html.TextBoxFor(m => m.TheString) 
     </div> 
     <p> 
      <input type="submit" value="Convert" /> 
     </p> 
    </div> 
} 

これはSIMでありますそれは私が考えるようになります。今や2番目のインデックスメソッドのreturn View(model);は明らかに機能していません。 RedirectToAction()についていくつか見て、TempDataにデータを保存しました。ほとんどの例では、いくつかのIDを送信していますが、私はdbが動作しないので、IDを送信しません。

私はこれを行う場合:

return RedirectToAction("Index", model); 

を、私は、このオブジェクトのために定義されていませんパラメータなしのコンストラクタ

を取得します。

エラーメッセージ。これは簡単ではありませんか?私はPost/Redirect/Getの概念を理解していると思いますが、これを単純なものとして適用する方法は見当たりません。

ありがとうございました。

答えて

1

MVCはそれはそれは私が「火曜日」を入れて日付フィールドに(例えば存在する場合、これはバインドをモデル化しません試みたフィールドの値ではなく、モデルの値を使用するビューをレンダリングしています'LLユーザーに入力があるフィールドを表示して無効にハイライト表示したい場合)、モデルの値は変更されますが、試行された値は変更されません。

しようとした値がにModelState辞書に保持されている:あなたのコード内の魔法の文字列の負荷をしない限りアクセスすると、これらの値を変更する

ModelState["KeyToMyValue"].Value.Value.AttemptedValue

はトリッキーなことができ、そして検証ようmodelbindingに起こるあなたの変更された値は検証されません。

これらの状況では、ModelState.Clear()を呼び出すことをお勧めします。これにより、すべての検証と試行された値が削除され、モデルが直接変更されます。最後に、TryValidateModel(yourModel)を使用してモデルの検証を行いたいとします。

この方法はおそらく、これを行う最も簡単で非ハックな方法ですが、返されたビューからバインドできなかった値を削除することに注意してください。

+0

ありがとうございます。これは機能します。しかし、基本的に正しい方法はRedirectToActionを使うことでしょうか?か否か? – Remy

+0

@Remyいいえ、投稿された無効なフォームを返すのは、フォームを返すことです。 PRGパターンは、成功したフォームを投稿した後にビューを返すためのものです(人々がフォームをリフレッシュして再送信するのを止めるため)。あなたは通常TryValidateModelの後にModelState.IsValidのブロックテストでRedirectToActionを持っています – Chao

1

あなたは2の方法から1つのメソッドを呼び出す必要がありますが、あなたはそれを

公共のActionResultインデックス(ToUppercaseModelモデル)を変更し、1つのメソッドモデルに送信する必要があります。

public ActionResult Index(ToUppercaseModel? model) 
    { 
     if (model == null)  
     ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" }; 
     return View(model); 
    } 
+0

しかし、それは私の第一の方法を私の第二の方法と全く同じように見せるでしょう。どちらも "public ActionResult Index(ToUppercaseModelモデル)" – Remy

+0

あります。しかし、それは動作します。実際、彼らは異なっています。それらの1つはPOSTメソッドです。また、コードが異なります。 POSTメソッドを使用してページを更新することはできないと思います。挿入したデータだけでモデルをそのまま返します。 –

+0

実際には、全く同じシグネチャを持つ2つのメソッドをコンパイルすることはできません。多分私は何かを見ない?おそらくあなたの例を更新できますか? – Remy

0

私は解決策を得ていると思うが、それはうまくいくが、これがどうあるべきかわからない。
基本的に私のモデルをTempDataに入れて、通常のIndexメソッドを再度呼び出します。

public ActionResult Index() 
    { 
     ToUppercaseModel model = null; 

     if (TempData["FeaturedProduct"] == null) 
     { 
      model = new ToUppercaseModel { TheString = "testing" }; 
     } 
     else 
     { 
      model = (ToUppercaseModel)TempData["FeaturedProduct"]; 
     } 
     return View(model); 
    } 


    [HttpPost] 
    public ActionResult Index(ToUppercaseModel model) 
    { 
     model.TheString = model.TheString.ToUpper(); 

     TempData["FeaturedProduct"] = model; 

     //return View(model); 
     return RedirectToAction("Index"); 
    } 
+0

これはそうかもしれないが...私は私の解決策を好む! ;)私のソリューションではコーディングが少なくなっています! :) –

+0

実際、私はチャオの解答に行った。あなたのものは大丈夫です、私はあなたの明確化の前に鉱山を掲示し、私はあなたにアップ投票を与えました。 – Remy

+0

タイ! ;-) –

関連する問題