在过去的几个小时里,我一直在努力解决这个问题。我要做的就是从当前路线中选择动作参数。此方法驻留在一个简单的静态助手类中。
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)。
答案 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();