2013-08-02 2 views
1

В каждом действии в каждом контроллере я хотел бы проверить, что в некоторых случаях вернет приложение другому контроллеру/действию. Я хотел бы, чтобы проверить, чтобы быть как можно более простым, чем-то вроде TestForExit();Использование RedirectToAction для выхода из контроллера/действия

Вот моя проблема: все мои действия возвращают ActionResult, а вот пример:

public ActionResult Partial() 
{ 
    TestForExit(); 
    ... 
    return PartialView("ViewPartial", data); 
} 

Если TextForExit возвращает RedirectToAction("Index", "Home") я должен иметь что-то вроде этого:

public ActionResult Partial() 
{ 
    var result = TestForExit(); 
    if(result == null) 
    { 
     ... 
     result = PartialView("ViewPartial", data); 
    } 
    return result; 
} 

Но, как я буду иметь это везде, я бы очень хотел иметь TestForExit() сам быть в состоянии послать меня Home/Index, а не возвращать закон ionResult, что мое действие должно вернуться.

Другими словами, как я могу использовать TestForExit ACTUALLY в Home/Index, вместо того, чтобы просто возвращать ActionResult, исходное действие должно быть возвращено?

ответ

0

В качестве альтернативы вы можете просто переопределить метод OnActionExecuting непосредственно в классе контроллера и добавить туда логику. Это будет иметь больше смысла, чем пользовательский атрибут, если вам нужна только эта логика выхода для одного конкретного контроллера.

1

Вы должны использовать пользовательский ActionFilter. Вы можете применить этот фильтр действий по всему миру. Затем в OnActionExecuting вы можете выполнить проверку TestForExit и перенаправить при необходимости.

Например.

public void TestForExitActionFilterAttribute : ActionFilterAttribute, IActionFilter 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(TextForExit()) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary {{ "Controller", "ExitController" }, 
              { "Action", "ExitAction" } }); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Теперь применить атрибут [TestForExitActionFilter] к контроллерам, или отдельных действий. Или, чтобы добавить его повсюду, добавьте следующую строку в FilterConfig.RegisterGlobalFiltersfilters.Add(new TextForExitActionFilterAttribute()).

Вот некоторые ссылки.

Redirecting to specified controller and action in asp.net mvc action filter

http://www.asp.net/mvc/tutorials/hands-on-labs/aspnet-mvc-4-custom-action-filters

+0

Спасибо. Я сохраню это как ссылку, хотя я выбрал другой ответ, подходящий для этой конкретной ситуации. –

0

Ну ваш метод действия контроллера должен вернуться в конце концов, так что вы до сих пор не возвращать ActionResult независимо от того, что, если действие выполняется.

Если вы хотите не добавлять этот код ко всем действиям, вы можете подумать о создании custom Action Filter, а затем пометить свои действия этим фильтром или применить глобальный фильтр, если вам это нужно для КАЖДОГО действия.

Затем в вашем фильтре действий вы проверяете свое условие выхода и при необходимости перенаправляете.

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