2016-12-09 4 views
0

Как исправить мой маршрут, чтобы устранить проблему с помощью AJAX .load()конфигурации Route ищет идентификатор в моем URL

Я изменил свой маршрут к моему spacecontroller так, что он выглядит как этот

routes.MapRoute(
      name: "SpaceCleanRoute", 
      url: "Space/{id}", 
      defaults: new { controller = "Space", action = "Index" } 
     ); 

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

www.mysite/пространства/12345

проблемы у меня сейчас, когда мой файл JS называет .load(), как это, где spaceoverview моего действие

$("#partialPageContainer").load('/Space/SpaceOverview', function (response, status, xhr) { 
     alert("Load was performed."); 
    }); 

Я получаю сообщение об ошибке говорящего

Параметров словарь содержит нулевую запись для параметра «id» не-nullable типа «System.Int32» для метода «System.Web.Mvc.ActionResult Index (Int32)» в «YogaBandy2017.Controllers.SpaceController». Необязательный параметр должен быть ссылочным типом, нулевым типом или объявлен как необязательный параметр. Имя параметров: параметры

Так что я должен поместить идентификатор после URL, как это, что это не то, что я хочу, или не кажется мне правильным

Как я могу это исправить или это как работает маршрутизация? Я своего рода новичок в MVC маршрутизации с ASP.Net

$("#partialPageContainer").load('/Space/SpaceOverview/1', function (response, status, xhr) { 
     alert("Load was performed."); 
    }); 

ОБНОВЛЕНО - Я думаю, теперь я буду использовать «/ пространство/ActionName/1» для подключения к каждому действию, пока я не могу найти лучшего решение.

+0

Вы пытались сделать идентификатор и нулевым первым, просто чтобы убедиться, что он попал в правый маршрут? – Faisal

+0

Я не уверен, что вы имеете в виду. Можете ли вы привести пример? Если я использую url '/ space/spaceoverview/{id}', то он работает, где id - любое число. Если я не использую id, генерируется исключение, и действие никогда не вводится. Это просто не кажется правильным, и я хотел бы знать, что есть способ сделать это, поэтому мне не нужно вводить идентификатор для загрузки? – user1186050

+0

''/Space/SpaceOverview' означает, что вы вызываете метод 'Index()' 'SpaceController '' (как определено вашим маршрутом), и вы передаете текст« SpaceOverview »в параметр« int id »(который, конечно, сбой и 'id' -' null' - отсюда исключение). Если вы хотите использовать метод 'SpaceOverview()', тогда вам нужно удалить это определение маршрута или создать определенные маршруты для каждого метода до маршрута 'SpaceCleanRoute' или добавить ограничение для обеспечения того, чтобы второй сегмент был' int' –

ответ

2

Вы можете использовать ограничение параметров, чтобы отфильтровать строки значения параметра id.

routes.MapRoute(
    name: "SpaceCleanRoute", 
    url: "Space/{id}", 
    defaults: new { controller = "Space", action = "Index" } 
    constraints: new { id = @"\d+" } 
); 

Тогда вам нужно иметь свой маршрут по умолчанию настроена для обработки вещей, которые не соответствуют, что ограничение:

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

Первый маршрут будет ловить ваш

/Space/12345

пример, поскольку 12345 соответствует @"\d+" модель, однако второй маршрут будет обрабатывать ваши

/Space/SpaceOverview

пример, потому что SpaceOverview нет.

Вы можете найти более подробную информацию и примеры маршрутов ограничений здесь: https://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

редактирования: Я считаю, что вы можете использовать один из встроенных в маршрутизации ограничений (которые могли бы работать лучше, потому что технически значение может соответствовать @"\d+" шаблон, но по-прежнему не является допустимым значением int), например:

routes.MapRoute(
    name: "SpaceCleanRoute", 
    url: "Space/{id}", 
    defaults: new { controller = "Space", action = "Index" } 
    constraints: new { id = new System.Web.Http.Routing.Constraints.IntRouteConstraint()} 
); 
0

Если вы хотите отправить параметр действия, попробуйте следующее:

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