2009-05-12 14 views
0

これは簡単なはずですが、答えがわかりません。コントローラに保存アクションがあり、保存に失敗した場合、ユーザーが入力した内容を妨害することなく、そのアクションをキャンセルするにはどうすればよいですか?たとえば、インデックスは「MyTableという」と強く型付けされている:私は戻るビュー(フォーム)を置けばキャッチでASP.NET MVCアクションを取り消す方法

Function Index() As ActionResult 
    ViewData("message") = "Hello" 
    Return View(New MyTable) 
End Function 

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal form As MyTable) As ActionResult 
    Try 
     SaveMyData(form) 
     Return RedirectToAction("Index") 
    Catch 
     AddModelError("form", "An error occurred.") 
     ??? 
    End Try 
End Function 

、私はViewDataを経由して渡されたメッセージを失います。インデックスにリダイレクトすると、ユーザーが入力した内容が失われます。私は以前これを扱う簡単な(正しい)方法を見たと思いますが、何を検索するのか分からなければ見つけるのは難しいです。私は何が欠けていますか?

答えて

1

、私は失う:以下は(にModelStateプロパティを経由して)エラーのためにあなたのビューを警告するだけでなく、入力された値を再表示するとメッセージはViewData経由で渡されます。

私が理解しているように、ViewData経由で渡されたメッセージは失われません。その機能は単に実行されません。

リダイレクトやTempDataを使用して達成しようとしていることに強くお勧めします。MVCが動作する方法ではなく、ポイントがあります。

あなたは何を持っているか私は両方のアクションがビューを返すために呼び出すプライベート関数を持っています。あなたのViewData( "メッセージ")が1か所にあり、フォームに以前の値が残っています(Josh EのようにModelState内にあります)。

WARNING:C#のプログラマからVB.NETの空気コード;-)

Function Index() As ActionResult 
    Return IndexView(New MyTable) 
End Function 

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal form As MyTable) As ActionResult 
    Try 
     SaveMyData(form) 
     Return RedirectToAction("Index") 
    Catch 
     AddModelError("form", "An error occurred.") 
    End Try 

    Return IndexView(form) 
End Function 

Private Function IndexView(ByVal form As MyTable) As ActionResult 
    ViewData("message") = "Hello" 
    Return View(form) 
End Function 

HTHS、 チャールズ

Psと。私はちょうどそれが自分自身に投稿するインデックスページを持っていることが奇妙なことを追加したいと思いますし、投稿にエラーがある場合はインデックスページを再表示しますが、エラーがなければインデックスページにリダイレクトします。

私はアプリが何をしているのかわかりませんが、あまりにも多くのことについてインデックスページ/ビューを使用しているようです。

+0

私は達成しようとしていたことをまっすぐにし、それがなぜそんな風に動作しているのかを説明しました。ところで、これはおそらく過度に単純化された実例でした - 私は実際のアプリケーションでインデックスビューを過負荷にしようとしていませんが、それでも指摘するのは良いことです。 – gfrizzle

0

リダイレクト時に、TempDataを使用してフォームからデータを格納し、IndexアクションのTempDataからデータをフェッチできます。ここにはdiscussion of TempDataがあります。

あなたの行動は、(恩赦VB.Net構文の私のsophomoric知識)のようになります。

Function Index() As ActionResult 
    ViewData("message") = "Hello" 

    If TempData["FormData"] == Nothing 
     Return View(New MyTable) 
    Else 
     Return View(TempData["FormData"]) 
    EndIf 
End Function 

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _ 
Function Save(ByVal form As MyTable) As ActionResult 
    Try 
     SaveMyData(form) 
    Catch 
     AddModelError("form", "An error occurred.") 
     TempData["FormData"] = form; 
    End Try 

    Return RedirectToAction("Index") 
End Function 

TempDataを同じホストから正確に一つの要求のためのデータを格納します。これは、Railsののフラッシュ機能とほぼ同じです。

1

フレームワークによって保持されるため、実際にフォーム値を明示的に格納する必要はありません。

"????"私はリターンビュー(フォーム)を置けばキャッチで

Return View(form) 
+0

私はこれが単純な解決策だと思っていたと思います。私が遭遇した問題は、値を覚えていないヘルパー関数を使ってドロップダウンを作成していないということでした。これはフォーム全体が変更された値を忘れていると誤っていました。私の問題は私の(考案された)例よりも深いようです。これがどのように機能するかをお礼してください。 – gfrizzle

関連する問題