2016-08-31 4 views
1

На моем веб-сайте MVC я хотел бы настроить мои маршруты следующим образом:Невозможно выполнить маршрут «{controller}/{action}/{id}" и "{controller}/{id}"

  • site.com/Customer - где вы можете выбрать заказчика.

  • site.com/Customer/123 - где вы можете ознакомиться с информацией для выбранного клиента.

Так в основном, имея только один вид, что в зависимости от того, если у вас есть {id} показывает разные вещи.

Так что я добавить отображенный маршрут DefaultNoAction в RouteConfig.cs:

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

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

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

И следующее в контроллере:

public ActionResult Index(int? id) 
{ 
    return View(id); 
} 

и вид:

@model int? 

... 

$(function() { 
    var customerId = @Model; 
    ... 
} 

Сейчас:

  • Если я пытаюсь доступа site.com/Customer/123 я получу 404.
  • Если я иду в site.com/Customer@Model не установлен ни к чему, поэтому, когда я ссылаться на него в моем JQuery он бросает синтаксическую ошибку, потому что он будет видеть var customerId = ;

Очевидно, что я не подхо Любое направление?

+1

Просто быстрая проверка - удалили ли маршрут по умолчанию для '{controller}/{action}/{id}'? – Max

+1

Это маршрут до маршрута по умолчанию (порядок имеет значение) –

+0

Не могли бы попросить поставить здесь полный RouteConfig.cs? Вы можете определенно пойти на маршрутизацию атрибутов. –

ответ

3

Порядок ваших маршрутов дела (механизм маршрутизации прекращает поиск, когда он находит первый матч). ../Customer/123 соответствует вам Default маршрут (он содержит 2 сегмента), и вы получаете 404, потому что в вашем нет метода с именем 123. Вам необходимо переместить маршрут DefaultNoAction до маршрута Default.

Однако это может вызвать другие проблемы с маршрутизацией, и вы должны сделать DefaultNoAction маршрут уникальным, если вы хотите использовать Default маршрут

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

Что касается яваскрипта ошибки, если вы хотите, чтобы значение customerId быть null, если методы id параметр null, то вы можете использовать

var customerId = @Html.Raw(Json..Encode(Model)); 
console.log(customerId); // returns null if the model is null 

в качестве примечания, ваш Parameters2 маршрут тоже не будет работать. Только последний параметр может быть помечен как Url.Optional, и если бы был предоставлен только один или два параметра, он соответствовал маршруту Default.

2

Использование атрибутов маршрутизации для него

[Route("api/Customer/{id:int?}")] 
public ActionResult Index(int? id) 
{ 
    if (id!=null)  
     return View(id); 
    return View(); 
} 
+0

@apomene спасибо за полезное редактирование – Mostafiz

+2

« Полезное »редактирование вообще не полезно - оно идентично исходному« обратному представлению (id); »code –

+0

@StephenMuecke yes it true но проблема с OP, s - это маршрут, поэтому, если он решает его, то другая логика, которую он может реализовать – Mostafiz

1

Изменение порядка в маршрутной конфигурации. Вторая конфигурация должна быть первой. Я не проверяю, но я думаю, что фрейм интерпретирует url site.com/Customer/123 как Customer является контроллером, а 123 - это имя действия.

Вид должен выглядеть так:

@model int? 

... 

$(function() { 
    var customerId = @(Model ?? 0); 
    ... 
} 
Смежные вопросы