2011-12-30 10 views
0

は、例えば、私のコントローラの[編集]アクションの次のコードを取る場合:私はこのアクションが何をしたいのか防止RedirectToAction()AJAX要求

// POST: /Admin/Text/Edit/5 
    [HttpPost] 
    [ValidateInput(false)] 
    public virtual ActionResult Edit(TextViewModel editing) 
    { 
     if (!ModelState.IsValid) 
      return View(editing); 

     Text existing = _repository.Find(editing.Id); 

     if (TryUpdateModel(existing)) { 
      _repository.Update(existing); 
      if(Request.IsAjaxRequest()) 
       return Content(bool.TrueString); 
      else 
       return RedirectToAction(pndng.Admin.Text.List()); 
     } 
     else return View(editing); 
    } 

は、古典的な(非AJAX form)およびAJAXの両方のハンドルです(jqueryの)POST。 AJAX POSTの場合、リクエストはインライン編集フォームから来ている可能性が非常に高いです。この場合、アクションはちょうどContent=Okの結果を返します。フォームページでモデルを編集し、古典的なpostbackを実行した場合、ユーザーをコンテンツリスト(RedirectToAction()を参照)に戻したいと考えています。

しかし、私を悩ますものはif..elseです。これをアクションフィルタ/アトリビュートに抽象化したいと思います。リダイレクトの呼び出しを中止したいのですが(既定)、リクエストが実際にAJAXリクエストであったことが検出された場合は、リダイレクトを停止してContentResultまたはJsonResultを返します。

私のワークフローが間違っていると思われる場合は、お気軽にご返信ください。

+1

'TryUpdateModel'が' false'とそのajaxリクエストを返すとどうなりますか? –

+0

私はあなたのポイントを見ます。これは実際にこのコードスニペットから抜けています。これは、1つのアクションで複数のユースケースをカバーしようとするときの問題の1つです。 – mare

答えて

2

IResultFilterを実装することで、必要な処理を行うためにカスタムResultFilterを実装する必要があります。何かのように:

public class AjaxOverrideFilter : IResultFilter 
{ 
    public void OnResultExecuting(ResultExecutingContext filterContext) 
    { 

    } 

    public void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Result is RedirectResult) 
      filterContext.Result = new ContentResult {Content = "Ok"}; 
    } 
} 

そして[AjaxOverrideFilter]でそのアクションを飾ります。

これは、ajaxリクエストと結果のタイプがリダイレクトの場合、結果をオーバーライドする必要があります...少なくとも、これは正しい方向へのプッシュを与えるはずです。私はこれが素晴らしいアーキテクチャーなアプローチだと大いに確信していません...

+0

これは私のアーキテクチャ上のアプローチには問題はないようですが、どうしましたか? – mare