8

アクション名、コントローラー名、HTTP動詞(GET、POSTなど)を指定して、アクションに特定のアクションフィルター属性がある(つまり、装飾されている)かどうかを確認することはできますか?

注:アクションとコントローラーは現在のアクションとコントローラーではありませんが、アプリ内の任意のアクションとコントローラーにすることができます。

ありがとう!

4

4 に答える 4

4

私は自分の質問に答えました、それはこれに非常に似ています。

http methodアクションとコントローラーの名前に加えて、正しい結果を得るには(つまり、GET、POST)も必要になります。

これは、問題を解決するコードの一部です。

var controllerFactory = ControllerBuilder.Current
    .GetControllerFactory();

var controllerContext = @this.ControllerContext;

var otherController = (ControllerBase)controllerFactory
    .CreateController(
        new RequestContext(controllerContext.HttpContext, new RouteData()),
        controllerName);

var controllerDescriptor = new ReflectedControllerDescriptor(
    otherController.GetType());

var controllerContext2 = new ControllerContext(
    new MockHttpContextWrapper(
        controllerContext.HttpContext.ApplicationInstance.Context,
        method),
    new RouteData(),
    otherController);

var actionDescriptor = controllerDescriptor
    .FindAction(controllerContext2, actionName);
于 2012-10-24T08:01:20.923 に答える
2

アクションにカスタム属性があるかどうかを確認する必要があるという同様の問題がありました。

public static IEnumerable<MyCustomAttribute> GetAttributes(string controllerName, string actionName)
    {
        var types = Assembly.GetExecutingAssembly().GetTypes();
        var controllers = types.Where(t => (t.Name == controllerName));
        var action = controllers.SelectMany(type => type.GetMethods().Where(a => a.Name == actionName)).FirstOrDefault();
        return action.GetCustomAttributes<MyCustomAttribute>(true);
    }

この SO 回答へのクレジット

于 2015-04-24T15:48:02.783 に答える
0

どこで確認したいのかよくわかりません。OnActionExecutingまたはOnActionExecutedで実行している場合。ActionExecutedContextには、プロパティActionDescriptorがあります。そこには、指定された属性タイプの 1 つ以上のインスタンスがこのメンバーに対して定義されているかどうかを確認する可能性を取得するIsDefinedメソッドがあります。以下のコードサンプルを確認してください。

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    var hasAutorizeAttr = filterContext.ActionDescriptor
                            .IsDefined(typeof(AuthorizeAttribute), false);
    base.OnActionExecuted(filterContext);
}

編集: OK、今私はあなたの問題を手に入れました。エレガントなソリューションはないようです。他のアクションをチェックしてAjaxExtensions.BeginFormメソッドで再生する必要がある場合、リフレクションという 1 つの方法しか表示されません。しかし、私の意見では、この場合はアーキテクチャを再考する必要があります。

于 2012-07-18T17:02:39.493 に答える