Стратегия маршрутизации ASP.Net MVC - PullRequest
4 голосов
/ 20 июня 2009

Я уже давно играю с ASP.Net MVC. Я обнаружил, что самая трудная вещь, чтобы получить право - таблица маршрутизации.

Я обнаружил, что большинство примеров оставляют маршрут по умолчанию на месте. Я обнаружил, что это приводит к большому количеству ошибок, когда маршрут по умолчанию перенаправляет на HomeController с действием, которое не существует. Приводит к странным сообщениям об ошибках, где вы ожидаете увидеть простой 404.

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

Я что-то здесь упускаю? Или это действительно хороший способ сделать что-то?


Глядя на полученные ответы, думаю, мне лучше немного прояснить вопрос.

Я пытаюсь обезопасить схему маршрутизации создаваемого веб-сайта. Я заметил, что когда я оставляю в маршруте по умолчанию {controller} / {action} / {id} все виды URL-адресов, где я хотел бы отобразить ошибку 404, фактически перенаправляются на HomeController с недопустимым действием и приводят к некоторой ужасной ошибке сообщение вместо.

Я немного запутался, потому что большинство примеров кода просто оставляют маршрут по умолчанию. Есть ли причина, по которой он есть, или его можно удалить?

Схема, которую я сейчас использую, выглядит примерно так

        routes.MapRoute( "About", "About", new {controller = "Page", action = "About"} );
        routes.MapRoute( "SignIn", "SignIn", new {controller = "Page", action = "SignIn"} );
        routes.MapRoute( "SignOut", "SignOut", new {controller = "Page", action = "SignOut"} );
        routes.MapRoute( "Authenticate", "Authenticate", new { controller = "Authentication", action = "Authenticate" });

        routes.MapRoute("CatchAll", "{*url}", new { controller = "Error", action = "Http404" });

У меня есть маршрут, указанный для каждого действия в системе. И ловушка для отображения 404 в конце. Это хороший способ сделать это или есть более простой способ сделать схему маршрутизации надежной?

Ответы [ 4 ]

7 голосов
/ 20 июня 2009

Если вы используете маршрут по умолчанию:

routes.MapRoute(
            "Default",                                             
            "{controller}/{action}/{id}",                           
            new { controller = "Home", action = "Index", id = "" } 
        );

тогда «HomeController» и действие «Index» будут использоваться по умолчанию, если в вашем URL не указано иное.

Например:

"http://www.something.com/" будет использовать действие Index контроллера Home, поскольку это контроллер и действие по умолчанию.

"http://www.something.com/foo" будет использовать действие Index контроллера Foo, поскольку" Index "является действием по умолчанию.

"http://www.something.com/foo/bar" будет использовать действие" bar "контроллера Foo

"http://www.something.com/foo/bar/1" будет использовать действие" bar "контроллера Foo, передавая" 1 "в качестве параметра" id "

Если у вас нет «FooController», все, что начинается с «http://www.something.com/foo", завершится ошибкой. Аналогично, если ваш FooController не имеет действия« Bar », то» http://www.something.com/foo/bar" потерпит неудачу.

Возможно, вы уже знаете все, что я написал выше. Если это так, вы будете публиковать URL-адреса с ошибками, чтобы мы могли лучше помочь?

2 голосов
/ 20 июня 2009

Я предпочитаю устанавливать маршруты явно для каждого метода действия.

Проверить это .

1 голос
/ 20 августа 2009

Это очень хорошая утилита, которая поможет вам отладить маршрутизацию:

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

0 голосов
/ 18 августа 2009

Этот вопрос немного старше, но я только что натолкнулся на тот же вопрос.

Я не слишком заинтересован в том, чтобы определять тонну маршрутов вручную, и при этом я не стремлюсь добавлять набор атрибутов для автоматического создания маршрутов для меня (ссылка Арниса).

После некоторого рассмотрения я решил использовать простую RouteConstraint, которую я создал. Я изменил маршрут по умолчанию, чтобы использовать его, и добавил свой 404 поймать ниже значения по умолчанию, например:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "" },
    new { controller = new ExistingControllerActionConstraint() }
);

routes.MapRoute(
    "CatchAll",
    "{*catchall}",
    new { controller = "Home", action = "NotFound" }
);

И класс ограничений:

public class ExistingControllerActionConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        Type t = Type.GetType("MvcApplication_BareMinimum7.Controllers." + values["controller"] + "Controller");

        if (t == null)
        {
            return false;
        }

        MethodInfo mi = (from m in t.GetMethods() where m.Name == values["action"].ToString() select m).FirstOrDefault();

        return (mi != null);
    }
}

Стоимость используемых Reflection и LINQ может перевесить стоимость регистрации десятков сотен маршрутов, но мне это кажется чище.

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