1

ブラウザがJS + Ajaxをサポートしている(オフになっていない)場合は、Ajaxを使用してサイトに投稿する「カートに追加」ボタンがありますが、サポートしていない場合、またはオフになっている場合手動スタイルの POST を実行します。

私が達成したいと思っているのは、ユーザーが通常の POST を使用して投稿する場合と、AJAX POST から送信する場合の 2 つのビューです。そうすれば、インライン メッセージ (部分的) または全画面を表示できます。

コントローラー/アクション コードを 2 回複製する必要はありませんが、エレガントではないようです。

この種の問題に対して推奨される解決策やパターンはありますか?

4

2 に答える 2

3

ジョン、

リクエストで IsAjaxRequest メソッドを使用して、これを判断できます。次のようにシナリオに適用します。

public ActionResult AddToCart(YourCartViewmodel cartViewmodel)
{
     if (ModelState.IsValid)
     {
         // do the standard/common db stuff here
         if(Request.IsAjaxRequest())
         {
             return PartialView("myPartialView");
         }
         else
         {
             return View("standardView");
         }
     }
     /* always return full 'standard' postback if model error */
     return View(cartViewmodel);   
}

おそらく完全な解決策を提供するわけではありませんが、これは良いスタートを切るはずです...

于 2012-07-09T11:06:53.660 に答える
1

コントローラーには 2 つの異なるアクションを含めることができます。1 つは通常の投稿用、もう 1 つは AJAX 用です。

public ActionResult AddToCart(Viewmodel vm)
{
     if (ModelState.IsValid)
     {
         DoStuff(vm);
         return View("ViewForRegularPost");
     }
     /* error */
     return View(vm);   
}

public ActionResult JsonAddToCart(Viewmodel vm)
{
     if (ModelState.IsValid)
     {
         DoStuff(vm);
         return View("ViewForJS");
     }
     /* error */
     return View(vm);     
}

コントローラー コードを繰り返す代わりに、実際のコントローラー コード用に別のメソッドを用意します。

public void DoStuff(Viewmodel vm)
{
    //TODO : Actual controller code goes here
}
于 2012-07-09T10:58:55.187 に答える