如何从ASP.NET MVC中的基本控制器连接公共代码

时间:2009-08-26 22:32:53

标签: asp.net-mvc

我的ASP.NET MVC应用程序是一个更大的ColdFusion应用程序的一小部分,它将很快被完全替换。我通过cookie从ColdFusion部分传递一些参数,并且需要在运行每个操作之前检查这些信息。如果信息丢失,我需要重定向到父站点。放置此功能以及如何统一调用它的最佳位置是什么?

目前,我已经实现了一个基本控制器,并且在每个操作方法中,我从基本控制器调用一个方法,并根据返回结果重定向或继续操作。这种方法似乎有效,但它使我的动作方法变得混乱,而consern与动作没有直接关系。我怎么能把它分开呢,我可以使用控制器的生命周期事件吗?

3 个答案:

答案 0 :(得分:6)

如果您已经实现了基本控制器,则只需覆盖其OnActionExecuting()方法:

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

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

答案 1 :(得分:2)

如果特定控制器中的每个操作都需要这样做,您可能使用的一个潜在选项就是在基本控制器中执行 ...

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 :(得分:2)

更好的方法是实现自定义ActionFilterAttribute并覆盖OnActionExecuting方法来处理逻辑,然后使用属性装饰您的操作。

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

希望这有帮助。