2011-06-26 9 views
0

imはjquery.postを使用しています。私の問題は、コントローラからの成功でなければ何を返すべきか分からないということです。モデルステートが有効でない場合、以下のコントローラをチェックしてみましょう。jquery投稿を使用して、成功しない場合は何を返しますか?

public ActionResult SendNewsLetter(FooterViewModel viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       var email = _newsletterService.GetAll().Where(x => x.Email == viewModel.Email).SingleOrDefault(); 

       if (email == null) 
       { 
        _newsletterService.Save(new NewsletterEmail() { AddedDate = DateTime.Now, Email = viewModel.Email, IdGuid = GenerateGuid.Generate() }); 
        _email.Send(viewModel.Email, "Title", "body", AppSetting.Value(Key.Email())); 
       } 
       else 
       { 
        _newsletterService.Delete(email.Id); 
       } 

       if (Request.IsAjaxRequest()) 
       { 
        return Content(FeedBackMessages.NewsletterSuccess()); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      catch (Exception) 
      { 
       //What to put here? 
      } 

     } 

     if (Request.IsAjaxRequest()) 
     { 
      //What to put here? 
      return Content(""); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

私のjqueryの

$('#formNewsletter').submit(function() { 
       $.post(this.action, $(this).serialize(), function (data) { success(data); }); 
       return false; 
      }); 
function success(message) { 
      //TODO the real success handle 
      alert(message); 
     }; 

答えて

1

エラー

$.post(this.action, $(this).serialize(), function (data) { success(data); }); 
       return false; 
      }).error(function() { alert("error"); }); 

編集に何かをするあなたのポスト()メソッドにこれを追加:

空の文字列を返すために、I JsonResultを返します。 ActionResultのサブクラスで、Dataというプロパティがあります。これにjson変数を追加して、javascriptでjs変数に解釈することができます。それはこのように見えるのJS側で

 catch (Exception) 
     { 
      return new JsonResult() { Data = "'Message' : ''" }; 
      //will return a json result with the data set to have a variable `Message` that is an empty string 
     } 

 $('#formNewsletter').submit(function() { 
      $.post(this.action, $(this).serialize(), function (data) { success(data); }); 
      return false; 
     }); 

    function success(data) { 
     //TODO the real success handle 
     alert(data.Message); //this should do it, I could be wrong, if so put a break point here and inspect the data object in firebug or dev tools to see where the `Message` json variable is stored. 
    }; 
+1

病気ありがとうございます。しかし、あなたが私のコントローラを見て、もしモデルステートがvaildでなく、そのRequest.IsAjaxRequestが空の文字列を返すならエラーではないでしょう。それについてどうすればいいですか? –

+0

@ Dejan.S私はあなたの2番目の質問に答えるための編集を追加しました。希望が役立つ –

0

私はあなたがJSONに慣れていない場合はhttp://www.json.org/

非常に簡単しかし、このようになるはずですここに行きますASP.NETに精通していませんが、私はContent(FeedBackMessages.NewsletterSuccess())が対応するHTTP応答にオブジェクトを変換すると仮定します。この特定のケースでは、おそらくローカライズされたStringContent-Type: text/plainという応答です。

私の提案はContent()はJSONにオブジェクトを変換すると仮定すると

class Result { 
    boolean success 
    String message 
} 

のように、唯一の成功またはエラーメッセージだけでなく、対応する状態が含まれていない結果オブジェクトに成功メッセージをラップすることです、あなたsuccess=falseResultオブジェクトを返し、これをjQueryの成功ハンドラで評価することができます。 (更新:JSONの結果オブジェクトを作成する方法を確認するためにマシュー・コックスの回答を参照してください。)

$.post(this.action, 
    $(this).serialize(), 
    function (data) { 
     // Data transport went fine, now check the application logic result: 
     if (data.success) { 
      success(data.message); 
     } else { 
      failure(data.message); 
     } 
    } 
); 

はたぶんもっと簡単な、ネイティブASP.NETのアプローチがありますが、これは一般的にうまく機能し、JSONがうまく上のサポートされていますJSクライアント側。

関連する問題