2009-06-20 5 views
4

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

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

В конечном итоге я установил для настройки маршрутизации, где я четко определяю все комбинации контроллеров/действий, которые я хочу разрешить, с помощью catch-all в конце для перенаправления на страницу 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 в конце. Это хороший способ сделать это или есть более простой способ сделать схему маршрутизации безупречной?

+0

Я нахожусь в одной лодке. Я думал, что поймать все будет работать, если по умолчанию маршрут не может найти контроллер + действие. Вместо этого контрольная фабрика выдает исключение. Вы все еще идете на явный маршрут? – dotjoe

ответ

7

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

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

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

Например:

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

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

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

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

Если вы не У меня есть «FooController», все, что начинается с «http://www.something.com/foo», не получится. Аналогично, если ваш FooController не имеет действия «Бар», то «http://www.something.com/foo/bar» не удастся.

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

+0

Вы на самом деле не отвечали на мой вопрос (я думаю, это моя вина за задание неопределенных вопросов), но вы прояснили некоторые другие вещи, которые я не знал, спасибо :-) Я попытался немного решить вопрос. – Mendelt

2

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

Отъезд this.

+0

Спасибо за указатель, проверите это! – Mendelt

0

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

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

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

 
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); 
    } 
} 

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

Смежные вопросы