2009-08-26 17 views
7

Moja aplikacja ASP.NET MVC jest niewielką częścią większej aplikacji ColdFusion, która wkrótce zostanie całkowicie wymieniona. Przesyłam niektóre parametry z części ColdFusion poprzez pliki cookie i muszę sprawdzić te informacje, zanim uruchomię każdą akcję. W przypadku braku informacji muszę przekierować do strony nadrzędnej. Jakie jest najlepsze miejsce, aby umieścić tę funkcjonalność i jak ją nazwać jednolicie?Jak podłączyć wspólny kod z podstawowego kontrolera w ASP.NET MVC

Obecnie zaimplementowałem kontroler bazowy iw każdej metodzie akcji wywołuję metodę z kontrolera bazowego i na podstawie wyniku zwracam albo przekierowanie, albo kontynuuję działanie. To podejście wydaje się działać, ale zaśmieca moje metody działania conserem, który nie jest bezpośrednio związany z akcją. Jak mogę to rozdzielić, czy są jakieś zdarzenia związane z cyklem życia kontrolera, z którego mogę skorzystać?

Odpowiedz

6

Jeśli już wdrożony kontroler baza tylko przesłonić jego OnActionExecuting() metody:

public class YourBaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if(somethingIsWrong) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new System.Web.Routing.RouteValueDictionary { ... }); 
     } 
    } 
} 
2

Jeśli jest to konieczne, na każde działanie w ramach danego kontrolera, jeden potencjalny opcja prawdopodobnie można użyć, to po prostu to zrobić w sterownika bazowego ...

public class MyBaseController: Controller 
{ 
    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     var cookie = base.Request.Cookies["coldfusioncookie"]; 
     //if something is wrong with cookie 
      Response.Redirect("http://mycoldfusionapp"); 
    } 
} 
2

Lepszym rozwiązaniem byłoby implementuj niestandardowe ActionFilterAttribute i nadpisaj metodę OnActionExecuting, aby obsłużyć logikę, a następnie udekoruj swoje działania atrybutem.

public class CheckCookieAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Check your cookie and handle the redirect here, otherwise, do nothing 
     // You can get to your cookie through the filterContext parameter 
    } 
} 

public class ActionController : Controller 
{ 
    [CheckCookie] 
    public ActionResult GetFoo() 
    { 
     return View(); 
    } 
} 

Mam nadzieję, że to pomoże.

+1

odpowiedź Kurta wydaje się bardziej logiczne, ponieważ zostanie to przeprowadzone na każde działanie. Gdyby to były tylko pewne działania, twoje podejście byłoby lepsze. – Martin

+0

Bez obaw Martin. Jeśli potrzebujesz go do każdej akcji, sugerowałbym odpowiedź na eu-ge-ne. Ja też byłam w pobliżu, ale wtedy zobaczyłam jego odpowiedź. –

Powiązane problemy