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

Установите маршрут к области, не указывая имя области в URL-адресе в MVC

У меня есть приложение MVC 4. В этом приложении у меня есть определенные области, URL-адрес которых не разрешен должным образом. LocationAreaRegistration.cs выглядит следующим образом:

context.MapRoute(
            "Location_default",
            "{culture}/{controller}/{action}/{id}",
            new { culture = "en", action = "LocationIndex", id = UrlParameter.Optional },
            new { controller = "(LocationIndex)" }
        );

Мой route.config выглядит следующим образом:

routes.MapRoute(
                 name: "Default",
                 url: "{culture}/{controller}/{action}/{id}",
                 defaults: new { culture = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
                 namespaces: new[] { "Locator.Areas.Location.Controllers" }
               ).DataTokens.Add("area", "Location");

Я также попытался изменить route.config, как показано ниже:

routes.MapRoute(
             name: "Default",
             url: "{culture}/{controller}/{action}/{id}",
             defaults: new { culture = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
             namespaces: new[] { "Locator.Areas.Location.Controllers" }
           );

Ни один из подходов не сработал, и я получаю ошибку The resource cannot be found.

Однако, когда я изменяю LocationAreaRegistration.cs следующим образом, он работает:

context.MapRoute(
            "Location_default",
            "{culture}/Location/{controller}/{action}/{id}",
            new { culture = "en", action = "LocationIndex", id = UrlParameter.Optional },
            new { controller = "(LocationIndex)" }
        );

Но я не хочу, чтобы URL-адрес содержал Location (имя области). Что я делаю не так?

ИЗМЕНИТЬ

URL-адреса, которые я собираюсь использовать, будут примерно такими:

http://localhost/en/LocationIndex/LocationIndex

Здесь en — текущая культура, Home — имя controller, а Index — имя action method.


  • Хороший набор MapRoutes, но без знания URL-адресов, на которые вы переходите, на этот вопрос невозможно ответить. 07.06.2016
  • @ErikPhilips: я отредактировал свой вопрос. пожалуйста, проверьте 07.06.2016
  • Ваша маршрутизация настроена неправильно. См. Зачем сначала отображать специальные маршруты перед общими маршрутами в asp.net mvc. 07.06.2016
  • @ NightOwl888- Да, это будет так, если я перенаправлю на http://localhost/en/Home/Index. Что, если я перенаправлю на http://localhost/en/LocationIndex/LocationIndex, тогда он должен быть перенаправлен на действие LocationIndex контроллера LocationIndex в области Location, но это не перенаправление. P.S. - Обновлен мой URL в вопросе 07.06.2016
  • @Alorika — при использовании встроенной маршрутизации URL-адрес должен содержать что-то, что маршрутизация может идентифицировать как область для соответствия маршруту области. Это что-то может быть литеральным сегментом или ограничением маршрута (которое может использовать Reflection только для сопоставления существующих областей). Вы сказали, что не хотите использовать буквальный сегмент, но неясно, почему это неприемлемо. Вы пытаетесь поместить функции сайта по умолчанию в область местоположения? 07.06.2016
  • @NightOwl888-Да, я добавлю функции сайта по умолчанию в область местоположения. 07.06.2016

Ответы:


1

Чтобы сделать область Location набором маршрутов по умолчанию для вашего приложения MVC, вам просто нужно определить область RouteConfig.cs следующим образом:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default_Localized",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { culture = new CultureConstraint(defaultCulture: "en", pattern: "[a-z]{2}") },
            namespaces: new string[] { "Locator.Areas.Location.Controllers" }
        ).DataTokens["area"] = "Location";

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { culture = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "Locator.Areas.Location.Controllers" }
        ).DataTokens["area"] = "Location";
    }
}

Обратите внимание, что это полностью заменит любую функциональность ваших контроллеров по умолчанию в приложении и отправит все запросы в пространство имен Location.

Вы не должны не помещать определения маршрутов в файл LocationAreaRegistration.cs. Это гарантирует, что они будут выполняться последними и не будут пересекаться ни с одним из ваших других маршрутов области.

Вот определение CultureConstraint. Подробнее о локализации маршрутов см. в этом ответе.

using System.Text.RegularExpressions;
using System.Web;
using System.Web.Routing;

public class CultureConstraint : IRouteConstraint
{
    private readonly string defaultCulture;
    private readonly string pattern;

    public CultureConstraint(string defaultCulture, string pattern)
    {
        this.defaultCulture = defaultCulture;
        this.pattern = pattern;
    }

    public bool Match(
        HttpContextBase httpContext, 
        Route route, 
        string parameterName, 
        RouteValueDictionary values, 
        RouteDirection routeDirection)
    {
        if (routeDirection == RouteDirection.UrlGeneration && 
            this.defaultCulture.Equals(values[parameterName]))
        {
            return false;
        }
        else
        {
            return Regex.IsMatch((string)values[parameterName], "^" + pattern + "$");
        }
    }
}
07.06.2016
Новые материалы

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

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

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

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

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

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

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