1

ビューに返される結果をフィルタリングするためのいくつかのオプションのパラメーターを持つIndexメソッドを備えたコントローラーがあります。

public ActionResult Index(string searchString, string location, string status) {
    ...

product = repository.GetProducts(string searchString, string location, string status);

return View(product);
}

以下のようにPRGパターンを実装したいのですが、どうすればいいのかわかりません。

[HttpPost]
public ActionResult Index(ViewModel model) {
    ...
    if (ModelState.IsValid) {
        product = repository.GetProducts(model);
    return RedirectToAction(); // Not sure how to handle the redirect
    }
return View(model);
}

私の理解では、次の場合はこのパターンを使用しないでください。

  • 実際にデータを保存していない限り、このパターンを使用する必要はありません(私はそうではありません)
  • このパターンを使用して、ページを更新するときにIEからの「再送信してもよろしいですか」というメッセージを回避することはできません(有罪)

このパターンを使用する必要がありますか?もしそうなら、私はこれについてどうしますか?

ありがとう!

4

2 に答える 2

5

PRGPost-Redirect-Get の略です。つまり、データをサーバーに戻すときは、GETアクションにリダイレクトする必要があります。

なぜこれを行う必要があるのですか?

顧客登録情報を入力するフォームがあり、送信をクリックして HttpPost アクション メソッドに投稿するとします。フォームからデータを読み取ってデータベースに保存していますが、リダイレクトは行っていません。代わりに、同じページにとどまっています。ここで、ブラウザーを更新すると (F5 ボタンを押すだけです)、ブラウザーは再び同様のフォーム投稿を行い、HttpPost アクション メソッドは再び同じことを行います。すなわち; 同じフォームデータを再度保存します。これは問題です。この問題を回避するために、PRG パターンを使用します。

PRGでは、submit をクリックすると、HttpPostAction メソッドがデータ (または必要な処理) を保存し、Getリクエストへのリダイレクトを実行します。したがって、ブラウザはGetそのアクションにリクエストを送信します

RedirectToActionメソッドはHTTP 302ブラウザーに応答を返します。これにより、ブラウザーは指定されたアクションに対して GET 要求を行います。

[HttpPost]
public ActionResult SaveCustemer(string name,string age)
{
   //Save the customer here
  return RedirectToAction("CustomerList");

}

上記のコードはデータを保存し、Customer List アクション メソッドにリダイレクトします。したがって、ブラウザの URL は now になりますhttp://yourdomain/yourcontroller/CustomerList。ここで、ブラウザを更新すると。IT は重複データを保存しません。CustomerList ページをロードするだけです。

検索アクション メソッドでは、Get アクションにリダイレクトする必要はありません。変数に検索結果がありproductsます。結果を表示するには、それを必要なビューに渡すだけです。重複したフォームの投稿について心配する必要はありません。それで、あなたはそれでいいです。

[HttpPost]
public ActionResult Index(ViewModel model) {

    if (ModelState.IsValid) {
        var products = repository.GetProducts(model);
        return View(products)
    }
  return View(model);
}
于 2012-05-17T00:45:38.733 に答える
2

リダイレクトは、別のアクションである単なる ActionResult です。したがって、SearchResults というアクションがある場合は、単純に次のように言います。

return RedirectToAction("SearchResults");

アクションが別のコントローラにある場合...

return RedirectToAction("SearchResults", "ControllerName");

パラメータで...

return RedirectToAction("SearchResults", "ControllerName", new { parameterName = model.PropertyName });

アップデート

複雑なオブジェクトを次のアクションに送信するオプションも必要かもしれないと思いました。その場合、オプションが限られているため、TempData が推奨される方法です。

あなたの方法を使用して

[HttpPost]
public ActionResult Index(ViewModel model) {
    ...
    if (ModelState.IsValid) {
        product = repository.GetProducts(model);
        TempData["Product"] = product;
        return RedirectToAction("NextAction");
    }
    return View(model);
}

public ActionResult NextAction() {
    var model = new Product();
    if(TempData["Product"] != null)
       model = (Product)TempData["Product"];
    Return View(model);
}
于 2012-05-17T00:44:23.943 に答える