gpt4 book ai didi

c# - 如何检索请求的操作方法的属性

转载 作者:太空狗 更新时间:2023-10-29 20:37:18 25 4
gpt4 key购买 nike

我正在尝试查看任何可能在 MVC 3 应用程序的 Controller 中修饰操作方法的身份验证属性。我在我自己的 HtmlHelper 扩展方法中执行此操作,这些方法基本上是 ActionLink 的包装器(为您提供我在运行时可用的信息的上下文)。我有一个基本的解决方案,但是重载的方法让它爆炸了。我知道该框架在内部将 url 解析为操作方法,但是在查看了 System.Web.Mvc.LinkExtensions 的代码之后,我仍然没有准确地找到它是如何发生的,所以我对如何来解决这个问题。

这是我目前用于解析相关方法的代码:

private static bool _IsUserAuthorized(HtmlHelper html,
string controllerName, string actionName)
{
controllerName = controllerName ??
html.ViewContext.RouteData.GetRequiredString("controller");

var factory = ControllerBuilder.Current.GetControllerFactory();
var controller = factory.CreateController(
html.ViewContext.RequestContext, controllerName);

Type controllerType = controller.GetType();
var methodInfo = controllerType.GetMethod(actionName,
BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);

... check authentication
}

所以我目前的问题是,当一个方法被重写时,我得到“发现不明确的匹配”异常。我猜我需要处理 RouteValues 来解析方法的任何参数,这样我才能明确地识别正确的参数。有没有人对如何执行此操作有一些指示?或者,该框架是否已经提供了解决所需确切方法的方法?

非常感谢!

最佳答案

编辑:更新方法以包含来自 this page 的见解.这个最终版本会查看请求的操作方法的 AuthorizationFilters,并检查用户是否有权执行该操作。

所以我在 System.Web.Mvc.ControllerActionInvoker 中四处寻找,找到了我需要的方法和构造函数。 ControllerDescriptor.FindAction() 最终成为关键。下面,我复制了我编写的方法,该方法将 检索所有属性

private static bool _IsUserAuthorized(HtmlHelper htmlHelper,
string controllerName, string actionName)
{
ControllerContext controllerContext = null;
//if controllerName is null or empty, we'll use the
// current controller in HtmlHelper.ViewContext.
if (string.IsNullOrEmpty(controllerName))
{
controllerContext = htmlHelper.ViewContext.Controller.ControllerContext;
}
else //use the controller factory to get the requested controller
{
var factory = ControllerBuilder.Current.GetControllerFactory();
ControllerBase controller = (ControllerBase)factory.CreateController(
htmlHelper.ViewContext.RequestContext, controllerName);
controllerContext = new ControllerContext(
htmlHelper.ViewContext.RequestContext, controller);
}

Type controllerType = controllerContext.Controller.GetType();
ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);
if (actionDescriptor == null)
return false;

FilterInfo filters = new FilterInfo(FilterProviders.Providers.GetFilters(
controllerContext, actionDescriptor));

AuthorizationContext authContext = new AuthorizationContext(controllerContext, actionDescriptor);
foreach (IAuthorizationFilter authFilter in filters.AuthorizationFilters)
{
authFilter.OnAuthorization(authContext);
if (authContext.Result != null)
return false;
}
return true;
}

关于c# - 如何检索请求的操作方法的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com