2011-12-30 4 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 절입니다. 나는 이것을 액션 필터/애트리뷰트로 추상화하고 싶다. 리다이렉션 호출을 떠나고 싶습니다. (기본값이기 때문에) 리디렉션을 중단하고 그냥 ContentResult 또는 JsonResult을 반환한다는 의미입니다. 요청이 실제로 AJAX 요청임을 감지하면 액션 필터가 작동합니다.

내 작업 흐름이 잘못되었다고 생각되면 언제든지 회신 해주십시오.

+1

'TryUpdateModel'이'false'와 그것의 ajax 요청을 반환한다면 어떻게 될까? –

+0

당신의 요점을 봅니다. 실제로이 코드 스 니펫에서 누락되었습니다. 하나의 작업으로 여러 사용 사례를 다룰 때 문제가되는 부분 중 하나입니다. – 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]으로 그 동작을 꾸미십시오.

아약스 요청 및 결과 유형이 리디렉션 인 경우 결과를 재정의해야합니다 ... 적어도 이것이 올바른 방향으로 푸시해야합니다. 나는 이것이 대단한 건축 적 접근이라고 격렬하게 확신하지는 않는다 ...

+0

내 건축 적 접근법은 괜찮아 보이지만 어떻게 했습니까? – mare