2016-01-19 4 views
3

пытается начать работу с ASP.NET MVC.Маршруты ASP.NET не запускаются, как я ожидаю

У меня возникли трудности при настройке основных маршрутов.

Мои маршруты заключаются в следующем:

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

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

     routes.MapRoute(
      name: "ImproItem", 
      url: "{controller}/{action}/{type}", 
      defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional } 
     ); 
    } 

мой взгляд вызовы:

<li>@Html.ActionLink("linkLabel", "Index", "ImproItemForm", new { type = "blablabla" }, null)</li> 

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

public class ImproItemFormController : Controller 
    { 
... 
    public ActionResult Index(String t) 
     { 
...} 
} 

мнение генерирует следующий HTML:

<li><a href="/ImproItemForm?type=blablabla">linkLabel</a></li> 

Это выглядит хорошо для меня. Однако эта ссылка правильно вызывает действие контроллера (используя маршрут ImproItem), но не передает аргумент blablabla. Параметр t = null при отладке приложения.

Можете ли вы объяснить мне, почему? Что я должен изменить, чтобы правильно принять аргумент blablabla?

Теперь, если я запустить приложение и попытаться просмотреть

Также это нормально, что когда я просматриваю: http://localhost:55193/ImproItemForm/Index?id=foobar Это называют (т String) метод ImproItemFormController.Index? я не ожидал, что этот URL будет соответствовать этому маршруту:

routes.MapRoute(
     name: "ImproItem", 
     url: "{controller}/{action}/{type}", 
     defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional } 
    ); 

Я думал, что аргумент должен иметь такое же имя, чем в маршруте: типа, а не идентификатор.

Thx заранее за вашу помощь.

+0

'type' не' t'. Измените метод на 'ActionResult Index (String Type)' или ссылку paramater на 'new {t =" blablabla "}' (в этом случае маршрут должен быть «url:» {controller}/{action}/{ t} ", –

ответ

2

Я думал, что аргумент должен иметь такое же имя, чем в маршруте: типа, а не идентификатор.

Фактически, когда вы запрашиваете URL-адрес - http://localhost:55193/ImproItemForm/Index?id=foobar, он фактически называет только маршрут по умолчанию, а не настраиваемый маршрут, который вы создали. По умолчанию маршрут имеет - имя контроллера, имя действия и идентификатор. Это означает, что если какой-либо URL-адрес, соответствующий этому шаблону (например, {controllername}/{actionname}/{id}), будет соответствовать маршруту по умолчанию.

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

Я думаю, все ваши проблемы для этого конкретного сценария должны быть решены путем выполнения следующих двух steps-

  1. Переместить маршрут по умолчанию в нижней части в коллекции маршрута в RouteConfig.cs
  2. Переименуйте параметр «t» в «тип» в действии индекса.
+4

Я бы добавил третий пункт: сделайте маршрут ImproItem определенным для своего контроллера. В настоящее время он поймает другие вызовы контроллеров, победив назначение маршрута по умолчанию, как только ваша первая точка будет выполнена. Url of ImproItem следует изменить на:' url: «ImproItemForm/{action}/{type}" ' –

+0

Спасибо Нирман и Фредерик за вашу помощь, это сейчас очень ясно для меня :) –

1

Измените имя параметра в своем действии, чтобы соответствовать имени в ActionLink

public ActionResult Index(String type)