Como fio código comum a partir de um controlador de base no ASP.NET MVC

votos
7

A minha aplicação ASP.NET MVC é uma pequena parte de um aplicativo maior ColdFusion que vai ser logo substituído completamente. Eu estou passando alguns parâmetros de ColdFusion parte através de cookies e precisa verificar esta informação antes de executar cada ação. No caso, se a informação está faltando eu preciso redirecionar para o site pai. Qual é o melhor lugar para colocar essa funcionalidade e como chamá-lo uniformally?

Atualmente, eu tenho implementado um controlador de base e em cada método de ação que eu chamar um método do controlador de base e com base no retorno resultar quer redirecionar ou continuar com a ação. Esta abordagem parece funcionar, mas ele enche os meus métodos de ação com consern não diretamente relacionado com a ação. Como eu poderia separá-lo para fora, existem eventos de ciclo de vida para o controlador que eu poderia bater?

Publicado 26/08/2009 em 23:32
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Se você já implementou um controlador de base apenas substituir o seu OnActionExecuting()método:

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

        if(somethingIsWrong)
        {
            filterContext.Result = new RedirectToRouteResult(
                new System.Web.Routing.RouteValueDictionary { ... });
        }
    }
}
Respondeu 27/08/2009 em 05:54
fonte usuário

votos
2

A melhor abordagem seria implementar um costume ActionFilterAttribute e substituir o OnActionExecuting método para lidar com a lógica e então apenas decorar suas ações com o atributo.

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();
    }
}

Espero que isto ajude.

Respondeu 27/08/2009 em 00:01
fonte usuário

votos
2

Se isso for necessário em cada ação dentro de um controlador especial, uma opção potencial que você provavelmente poderia usar é apenas para fazer isso no controlador de base ...

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");
    }
}
Respondeu 26/08/2009 em 23:43
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more