2013-05-21 7 views
8

フォームを含むポップアップウィンドウがあるとします。フォームを処理するコントローラーが必要です。結果に応じて、このコントローラーはJSON(すべてがうまくいけばポップアップをjavascriptで閉じる)かHTMLを返します(フォームデータが無効でフォームを置き換えなければならない新しいhtmlと - 検証エラーメッセージが表示されます)。それは、フォームの:: は、だから、僕は、このような解決策を見つけたコントローラは結果に応じてJSONまたはHTMLを返すことができます

<form id="message" ...> 
    ... 
</form> 

そして私は、このフォームのjQueryのハンドラがあります。

$(document).on("submit", "form#message", function (evt) { 
    evt.preventDefault(); 
    $.ajax({ 
     type: this.method, 
     url: this.action, 
     data: $(this).serialize(), 
     success: function (result) { 
      if ($.isPlainObject(result)) { 
       // this is JSON 
       // close the pop-up window 
      } else { 
       // this is HTML 
       $("form#message").html(result); 
      } 
     } 
    }); 
}); 

コントローラー:

[HttpPost] 
public ActionResult UpdateMessage(MessageModel model) 
{ 
    ... 
    if (.. is valided ..) 
     return Json(new { success = "OK" }); 
    else 
     return View(model); 
} 

質問を - もっとありますそのようなタスクのためのエレガントなソリューション?

+1

をcall.'行うことができます分かりやすくするためにjsonキーの中にhtmlを戻し、エラーキーが設定されているかどうかを確認するだけですか? –

+0

@fliespl、ASP.NET MVCビューをサーバー上の文字列にレンダリングし、それらの部分をJSONにシリアル化するのはちょっとしたPITAです。 –

+0

本当ですか?私が正しく覚えていれば、ちょうど数行で部分的にレンダリングすることができます - おそらくコード内の数字と同じです:) –

答えて

5

IMHOこれは、この問題と私が間違いなく使用するものに対する非常に良い解決策です。

+1

あなたの解決策に間違いはありません。私にはうまく見えます。 –

+0

回答ありがとうございます。私はちょうど同じような仕事が頻繁に起こると思っていました。おそらく標準的な解決策のいくつかの種類があります。だから、正方形の車輪を再発明しないように、世界の周りを気にせずに丸い車輪を楽しんでいます:) –

2

あなたのアプローチでうまくいくと思います。しかし、JSONエラーメッセージがすべての画面で共通する場合は、この場合にアクションフィルタを記述することをお勧めします。だから我々はなぜでしょうコードよりエレガント

[HttpPost] 
[JsonErrorHandling] 
public ActionResult UpdateMessage(MessageModel model) 
{  
    return View(model); 
} 

public class JsonErrorHandlingAttribute : ActionFilterAttribute, IActionFilter 
{ 
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // TODO: doing some thing magic here 
     // if (.. is valided ..) 
     // return Json(new { success = "OK" }); 

     this.OnActionExecuting(filterContext); 
    } 
} 
+1

私の場合、コントローラはJSONを返します。エラーはHTMLに返されます。そして 'TODO'はクライアント側で実行されなければなりません - Javaスクリプトで。しかし、あなたの答えをありがとう - それは別の場所で私に役立つだろう;) –

0

あなたはURLから複数のデータ型を返す必要があれば、jQueryのAJAXでデータ型を渡す必要がありませんが

$.ajax({ 
    type: "GET", 
    url: url, 
    data: data, 
    //dataType: "json", comment this line 
    cache: false, 
    beforeSend: function() {}, 
    success: function (data) {}, 
    error: function (xhr, ajaxOptions, errorThrown) {} 
    }); 
関連する問題