使用帮助程序类访问ActionExecutingContext

时间:2010-07-31 21:13:57

标签: asp.net-mvc-2

在过去的几个小时里,我一直在努力解决这个问题。我要做的就是从当前路线中选择动作参数。此方法驻留在一个简单的静态助手类中。

    public static string GetStateName(ActionExecutingContext filterContext)
    {
        var stateParam = filterContext.ActionParameters.Where(p => p.Key == RouteConst.StateName).FirstOrDefault();
        return !string.IsNullOrEmpty(stateParam.Key) ? stateParam.Value.ToType<string>() : string.Empty;
    }

但是,每次我必须调用此方法时,我不喜欢传入上下文的想法。有没有办法像HttpContext.Current一样访问当前执行的上下文?

更新:使用Necros的建议,这就是我最终要做的事情。

公共静态类ActionExtensions     {

    public static string GetMarketName(this ActionExecutingContext filterContext)
    {return GetActionParamValue(filterContext, RouteConst.MarketName).ToType<string>();}

    public static string GetStateName(this ActionExecutingContext filterContext)
    {return GetActionParamValue(filterContext, RouteConst.StateName).ToType<string>();}

    private static string GetActionParamValue(ActionExecutingContext filterContext, string actionParamName)
    {
        var actionParam = filterContext.ActionParameters.Where(p => p.Key == actionParamName).FirstOrDefault();
        return !string.IsNullOrEmpty(actionParam.Key) ? actionParam.Value.ToType<string>() : string.Empty;
    }

ToType()是另一种扩展方法,它在内部使用Convert.ChangeType(value,type)。

1 个答案:

答案 0 :(得分:1)

不,只是因为ActionExecutingContext仅在OnActionExecuting事件期间有效(或者无论它来自何处)。你所能做的就是把它变成一种扩展方法,使它看起来很漂亮。

public static string GetStateName(this ActionExecutingContext filterContext)
{
    var stateParam = filterContext.ActionParameters.Where(p => p.Key == RouteConst.StateName).FirstOrDefault();
    return !string.IsNullOrEmpty(stateParam.Key) ? stateParam.Value.ToType<string>() : string.Empty;
}

并像这样称呼它

var stateName = filterContext.GetStateName();