2010-07-31 76 views
0

在过去的几个小时里,我一直在努力。我所要做的就是像这样从当前路线中选择操作参数。这个方法驻留在一个简单的静态助手类中。使用助手类访问ActionExecutingContext

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(值,类型)另一种扩展方法。

回答

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