.Net MVC Ratching Catchall не работает - PullRequest
16 голосов
/ 26 ноября 2008

Я не могу понять это. Я экспериментирую с бета-версией MVC и пытаюсь реализовать универсальный маршрут так, чтобы, если пользователь вводит mysite.com/blah вместо mysite.com/home/index, он попадает в маршрут «Ошибка».

К сожалению, кажется, что маршрут "Default" всегда сначала ловит "бла". Фактически, единственный путь, по которому я смог добраться до маршрута «Ошибка», это бла / бла / бла / бла.

Так ли это должно работать, потому что я видел другие примеры, в которых маршрут «По умолчанию» и «Ошибка» настроен именно так, и кажется, что если бы они вводили контроллер, который не ' Если бы он существовал, он попал бы по маршруту «Ошибка».

Есть ли что-то, что я пропускаю (очень возможно), или мне просто нужно создать определенный маршрут для каждого контроллера?

Код, который я использую:

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "Error",
            "{*catchall}",
            new { controller = "Base", action = "Error", id = "404" }
        );

Спасибо, Джефф

Ответы [ 4 ]

6 голосов
/ 26 ноября 2008

Для обработки ошибок я использовал событие Application_Error в одном из моих проектов:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    HttpException httpException = exception as HttpException;
    if (httpException != null)
    {
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "HttpError500");

            if (httpException.GetHttpCode() == 404)
            {
                routeData.Values["action"] = "HttpError404";
            }

        Server.ClearError();
        Response.Clear();
        IController errorController = new ErrorController();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }
}
6 голосов
/ 26 ноября 2008

Ваш первый маршрут будет перехватывать большинство URL, так как у вас есть значения по умолчанию для элементов, вы можете визуализировать это с помощью отладчика маршрута от Фила Хаака, см. Ссылку:

Отладчик маршрута

3 голосов
/ 26 ноября 2008

Маршруты MVC проверяются в порядке их ввода.

Mysite / blah будет найден по умолчанию. Контроллер будет бла, а действие индексное.

Когда вы ввели маршрут mysite / blah / blah / blah / blah, вы указали ему маршрут, по которому он не мог сопоставить маршрут по умолчанию, и тогда был назван ваш универсальный маршрут.

Для тех других примеров, вы заметили, были ли у них настроены фильтры ошибок? Я почти уверен, что на сайте mvc asp.net по умолчанию уже есть некоторые атрибуты обработки ошибок на страницах.

0 голосов
/ 25 июня 2012

Это также может помочь при решении проблем с MVC:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{*id}",                          // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

То есть там, где написано {id}, измените его на {*id}. Это позволяет последнему параметру id использовать столько дополнительного пути, сколько может быть передано. Правило по умолчанию принимает это:

/ человек / имя / джо

Но не это:

/ продукция / список / SortBy / имя

Второй URL-адрес выдаст 404 без этой модификации маршрута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...