2016-03-15 1 views
3

У меня возникла ситуация, когда мне нужно вернуть JSONResult или Redirect. Возможно ли это?Как вернуть JsonResult или ActionResult в том же методе в зависимости от ввода?

Пример:

public ActionResult Example(string code) 
{ 
    if(string.IsNullorEmpty(code)) 
    return RedirectToAction("Index", "Home"); 
    else 
    return Json(new { success = true, message= "Next step"}); 
} 
+2

Да, можно вернуться и, так как они являются 'ActionResults'. Но если вы вернете «RedirectToAction» внутри Ajax Call, он не будет перенаправлен. Это твоя проблема? –

ответ

3

Да, это возможно. Фактически, код, который вы опубликовали, точно так же, как вы это делаете!

Controller.RedirectToAction возвращает RedirectToRouteResult, Controller.Json возвращает JsonResult. Они оба наследуют от ActionResult, поэтому возвращение их как ActionResult будет работать нормально.


Если вы работаете с AJAX:

Даже если вы не сказали, что ваш вызова контекст был, как уже упоминалось в insightful comment by Thiago Ferreira, перенаправляет не работают с AJAX. Вам необходимо вернуть сообщение об ошибке, а затем обработать его на стороне клиента.

Например о способе действия:

public ActionResult Example(string code) 
{ 
    if(string.IsNullorEmpty(code)) 
    { 
     UrlHelper urlHelper = new UrlHelper(HttpContext.Request.RequestContext); 
     string actionUrl = urlHelper.Action("Index", "Home"); 
     return Json(new { success = false, message = "Code not provided", redirectTo = actionUrl}); 
    } 
    else 
    { 
     return Json(new { success = true, message= "Next step"}); 
    } 
} 

Handling его на стороне клиента:

if(response.success) { 
    // yay 
} else if(response.redirectTo) { 
    window.location.href = response.redirectTo; 
} 
+0

Этот метод, вероятно, предпочтителен, но вы * можете * вернуть либо JsonResult, либо RedirectToAction. Несмотря на то, что вам нужно будет иметь функции успеха/отказа/выполнения вашего вызова Ajax, можно проверить, является ли ответ возвращенным представлением против объекта json. В противном случае обратные вызовы не будут знать, нужно ли отображать контент, какой элемент DOM его вставить, или если они должны просто сделать некоторую логику, основанную на Json. – Erik

+0

Но в каком состоянии мы можем использовать как единый метод? На самом деле? –

Смежные вопросы