Nano Hash - криптовалюты, майнинг, программирование

ASP.NET MVC — получение атрибутов вызываемого действия

Учитывая строку для имени действия и контроллера и RouteValueDictionary для значений маршрута, как мне вернуть любые атрибуты, примененные к действию, которое должно быть вызвано?

Я был бы признателен, если бы кто-то мог помочь. Спасибо


  • Type.GetType(<yourcontrollerName>).GetMethods().Where(m => m.Name == <yourActionName>).Attributes предоставит вам все атрибуты действий, соответствующих имени в контроллере. Вы должны быть в состоянии получить правильное действие (говоря, что у вас есть два метода с одинаковыми именами, один для GET, один для POST), играя с ключами/значениями RouteValueDictionary... Немного больше контекста должно помочь. 20.07.2012
  • Я полагал, что в ядре должен быть метод для этого, поскольку, очевидно, ASP.NET MVC должен справиться с этим самостоятельно. 20.07.2012

Ответы:


1

Мне удалось придумать следующее:

protected IList<string> GetNamespaces(string area, RouteCollection routes) {
    return routes.OfType<Route>()
        .Where(r => r.DataTokens != null)
        .Where(r => (string.IsNullOrEmpty(area) && r.DataTokens["area"] == null) ||
            (r.DataTokens["area"] != null && r.DataTokens["area"].ToString() == area))
        .SelectMany(r => (IEnumerable<string>)r.DataTokens["Namespaces"])
        .Distinct()
        .ToList();
}

public IList<Type> GetControllerTypes() {
    // Note you may wish to improve this to select from all the referenced assemblies aswell
    return Assembly.GetExecutingAssembly().GetExportedTypes()
        .Where(t => typeof(IController).IsAssignableFrom(t) && !t.IsAbstract)
        .ToList();
}

public Type GetControllerType(string controller, string area) {
    // Get the namespaces for the area
    var namespaces = GetNamespaces(area, RouteTable.Routes);

    // Return the controller type that matches a namespace and controller name
    return GetControllerTypes()
        .Single(t => t.Name == controller + "Controller"
            && namespaces.Any(n => n == t.Namespace));
}

Теперь вам просто нужно сказать следующее, чтобы получить тип:

var type = GetControllerType("Admin", "Blog");

Из этого вы можете легко получить действие или любые атрибуты, применяемые с помощью отражения.

Надеюсь, это может помочь кому-то.

20.07.2012

2

В качестве решения @nfplee вы можете получить контроллер по области и имени контроллера, но помните, что он может возвращать исключение Sequence contains no matching element, если только вы не укажете правильное пространство имен в «Регистрация маршрутов». Добавьте пространство имен к основным регистровым маршрутам в RouteConfig так же, как и к любым областям в методе RegisterArea.

Надеюсь, это полезно.

Удачи.

07.02.2013
  • Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его сообщением — вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно reputation вы сможете комментировать любой пост. 07.02.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..