我正在编写一个ActionFilter,并希望有一种更加类型安全的方式来使用RedirectToRouteResult。在研究这个时,我想知道是否有办法获得任何控制器的名称(作为字符串)。所以,例如,我想得到" Home"来自我的HomeController,或者#34; Admin"从我的管理员控制器。这有可能吗?
答案 0 :(得分:3)
从过滤器上下文中,您可以使用以下命令获取控制器名称:
public class MyFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext filterContext)
{
//That will give you "HomeController"
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//You can remove the "Controller" part, by replacing it with an empty string, like:
var justTheController = controllerName.Replace("Controller", string.Empty);
}
}
答案 1 :(得分:1)
你试过这个吗?您知道可以在实例变量上用GetType替换typeof。如果你有HomeController实例homeCtrl ....你可以做homeCtrl.GetType
var fullName= typeof(HomeController).Name;
var partialName = fullName.Remove(fullName.IndexOf("Controller"));
答案 2 :(得分:0)
实际上有办法获取控制器名称:
filterContext.Controller
会给你一个对象
可以将控制器名称推导为
filterContext.Controller.GetType().Name
controller
,并且可以推导为Request.RequestContext.RouteData.Values("controller").ToString()
答案 3 :(得分:0)
编写扩展方法
public static class ControllerStringExtension
{
private const string ControllerString = "Controller";
public static string Short(this string value)
{
if (value.EndsWith(ControllerString))
{
//Remove 'Controller' from end of value name.
return value.Remove(value.Length - ControllerString.Length);
}
throw new ApplicationException("Should be used only for Controller names.");
}
}
比使用:重定向到' home'控制器和'索引'动作。
public RedirectToRouteResult Something()
{
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Short());
}