Вопрос

Почему следующее Html.ActionLink вызов:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

Создайте URL с параметрами запроса, а не «Restful» URL, т.е.

http://localhost/Website/Case/Advance/1?step=Refer

У меня есть только зарегистрирован маршрут по умолчанию, нужны ли мне дополнительные маршруты, которые могут понять, каков параметр «Steptype»?

Я попытался добавить этот маршрут в после маршрут по умолчанию:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

Но это не имело никакого эффекта. Добавление новой регистрации маршрута до По умолчанию мне ошибровались:

Словарь параметров содержит нулевую запись для параметра «идентификатор» не нулевого типа 'System.int64' для метода 'System.Web.mvc.ActionResult Advance (int64, webse.core.steptype)' в 'websent.controllers.casecontroller ' Чтобы сделать параметр необязательным, его тип должен быть либо эталонным типом, либо нулевым типом.

Это было полезно?

Решение

Пользовательский маршрут слишком сильно ловит слишком много

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

http: // localhost/сайт

Ваш пользовательский маршрут поймал бы его. И установить его по умолчанию. И позвони своему CaseController.Advance() действие. И, конечно, бросить исключение, потому что id не определено.

Сохраняйте свой собственный маршрут перед по умолчанию

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

Но какое изменение вы должны внести? Если будет только один контроллер, который нуждается в нем, чем изменить его на:

routes.MapRoute(
    "CaseAdvance",
    "Case/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});

Если есть другие контроллеры, вы можете сохранить его как бы, просто добавьте ограничения:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { controller = "Case|Other" });

Если может быть какой -либо контроллер, вы можете сделать требование, чтобы ваш идентификатор был численным:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { id = @"\d+" })

В этом случае этот маршрут поймет только те запросы, которые на самом деле определяют идентификатор. Как количество конечно.

Вы узнаете, какой из них вам подходит лучше всего.

Другие советы

Да, если нет маршрута, такого как «{Controller}/{Action}/{id}/{step}», тогда метод ActionLink просто пройдет «шаг» в качестве параметра запроса.

В вашем маршруте вы указали параметр steptype, но ваш прохождение параметра называется шагом.

Имена ваших параметров ActionLink должны соответствовать именам параметров маршрута, или вы получите именно то, что вы видите.

РЕДАКТИРОВАТЬ: ОК, вы изменили свой код, пока я печатал этот ответ !!

Попробуйте использовать РУБАЛИКА И посмотрите, работает ли это для вас.

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

Если вызов RateLink создает действительную ссылку, она, по крайней мере, означает, что ваш маршрут будет правильно настроен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top