asp .net mvc routing: как использовать действие по умолчанию, но не параметр по умолчанию?

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

При настройке маршрутизации вы можете указать значения по умолчанию для разных частей URL / маршрута. Рассмотрим пример, который генерирует мастер VS:

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults

В этом примере, если контроллер не указан, URL-адреса обычно выглядят так: http: // mysite / MyController / MyAction .

Если в URL-адресе нет действий, подобных этому: http: // mysite / MyController , тогда будет использоваться действие index.

Теперь предположим, что у меня есть два действия в моем контроллере Index и AnotherAction. Соответствующие им URL-адреса: http: // mysite / MyController и http: // mysite / MyController / AnotherAction соответственно. Мое действие «Индекс» принимает параметр id. Итак, если мне нужно передать параметр моему действию Index, я могу сделать это: http: // mysite / MyController / Index / 123 . Обратите внимание, что, в отличие от URL http: // mysite / MyController , я должен явно указать действие Index. Я хочу передать http: // mysite / MyController / 123 вместо http: // mysite / MyController / Index / 123 . Мне не нужен "Индекс" в этом URL-адресе. Я хочу, чтобы механизм mvc распознал, что когда я запрашиваю http: // mysite / MyController / 123 , это 123 не является действием (потому что я не определил действие с этим именем), но параметр моего действия по умолчанию «Индекс». Как мне настроить маршрутизацию для достижения этой цели?

Ниже приводится исходная формулировка вопроса.


У меня есть контроллер с двумя методами, определенными следующим образом

    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(SomeFormData data)
    {
        return View();

    }

Это позволяет мне обрабатывать URL-адреса типа http: // website / Page как когда пользователь переходит по этому URL (GET), так и когда он впоследствии отправляет форму обратно (POST).

Теперь, когда я обрабатываю сообщение обратно, в некоторых случаях я хочу перенаправить браузер на этот URL:

http://website/Page/123

Где 123 - некоторое целое число, и мне нужен метод для обработки этого URL в моем контроллере.

Как мне настроить маршрутизацию, чтобы это работало? В настоящее время у меня есть маршрутизация по умолчанию, сгенерированная мастером следующим образом:

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults

Я попытался добавить другой метод контроллера, например этот:

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

Но это не работает, так как генерируется исключение неоднозначного действия:

Текущий запрос на действие 'Индекс' на типе контроллера 'PageController' неоднозначно между следующими методы действия: System.Web.Mvc.ActionResult Index () в тип PageController System.Web.Mvc.ActionResult Индекс (Int32) по типу PageController

Я должен добавить, что у меня также есть другие действия в этом контроллере. Это сработало бы, если бы я этого не сделал.

17
задан Community 23 May 2017 в 12:17
поделиться