2014-01-27 4 views
4

Моя маршрутизация работает неправильно. У меня есть следующие маршруты определены:Маршрутизация ASP.NET MVC не работает

routes.MapRoute(
    name: "CategoryDetails", 
    url: "{seoName}", 
    defaults: new { controller = "Category", action = "Details" } 
); 

routes.MapRoute(
    name: "ContactUs", 
    url: "contact", 
    defaults: new { controller = "Home", action = "Contact" } 
); 

routes.MapRoute(
    name: "AboutUs", 
    url: "about", 
    defaults: new { controller = "Home", action = "About" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Когда я нажимаю на о нас или связаться с нами связь, то он принимает меня к методу детали действия в категории контроллере.

Это Разметка для моих О нас и контакты ссылки:

@Html.ActionLink("About", "About", "Home") 
@Html.ActionLink("Contact", "Contact", "Home") 

Мой метод подробности действий по категории управления:

public ActionResult Details(string seoName) 
{ 
    CategoryViewModel model = categoryTask.Details(seoName); 

    return View(model); 
} 

Что не так с моей конфигурации маршрута?

ответ

25

Изменить порядок маршрутов от наиболее специфических до менее конкретных. Таким образом, маршруты для контакта и о том, будет предшествовать маршрут seoName:

routes.MapRoute(
     name: "ContactUs", 
     url: "contact", 
     defaults: new { controller = "Home", action = "Contact" } 
); 

routes.MapRoute(
     name: "AboutUs", 
     url: "about", 
     defaults: new { controller = "Home", action = "About" } 
); 

routes.MapRoute(
     name: "CategoryDetails", 
     url: "{seoName}", 
     defaults: new { controller = "Category", action = "Details" } 
); 

routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

С исходный порядок, то URLs ~/contact и ~/about всегда будет обрабатываться по маршруту seoName. Переупорядочивая их, вы убедитесь, что они обрабатываются надлежащими действиями в HomeController, и маршрут seoName будет соответствовать URL-адресу только после того, как контакт и о маршрутах не совпадают.

+0

спасибо человеку! =) –

+2

Я не знал о порядке маршрутизации, и этот ответ спасает мой день !!! +1 –

3

Сначала определяется маршрут CategoryDetails. Вот почему он соответствует, например, URL-адресу «http://server/AboutUs» (seoName будет присвоен «AboutUs»). Сначала следует определить наиболее специфические маршруты (AboutUs, ContactUs).

1

Следующие проблемы вызывают у вас проблемы. прокомментируйте это или разместите внизу.

routes.MapRoute(
    name: "CategoryDetails", 
    url: "{seoName}", 
    defaults: new { controller = "Category", action = "Details" } 
); 

Изначально маршрут Defualt работает, и вы принимаете HomeControllers Indeax action.

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

Попробуйте добавить следующую строку в контроллер и просмотреть. так что вы поймете, как и были вы собираетесь неправильно

public ActionResult Details(string seoName) 
    { 
     ViewBag.ValueReceived = seoName; 
     return View(); 
    } 

и в свете

<h1>@ViewBag.ValueReceived</h1> 

При нажатии Контакт или детали URL-адрес будет напоминающая

http://arunkumar.com:62115/about

Здесь 'about' считается значением для seoName и выбрана неправильная маршрутизация

+0

Хорошее объяснение того, как можно отлаживать и прийти к правильному выводу, а также ответ, который ищет OP. –

0

у меня был подобную ошибку, я помещал

HttpPost("/route")
вместо

HttpPost("route")
Смежные вопросы