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

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

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

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

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

если в Url нет такого действия:http://mysite/MyController затем будет использоваться действие индекса.

теперь предположим, что у меня есть два действия в моем индексе контроллера и AnotherAction. URL-адреса, которые им соответствуют, являются http://mysite/MyController и http://mysite/MyController/AnotherAction соответственно. Мое действие "индекс" принимает параметр id. Поэтому, если мне нужно передать параметр в действие индекса, я могу сделать следующее:http://mysite/MyController/Index/123. Обратите внимание, что в отличие от URL http://mysite/MyController, Я должен указать индекс действие явно. То, что я хочу сделать, это иметь возможность пройти 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-адреса в моем контроллере.

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

        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' неоднозначен между следующих метод действия: Система.Сеть.В MVC.ActionResult Index () on PageController тип Система.Сеть.В MVC.ActionResult Индекс (Int32) по типу PageController

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

4 ответов


вот как это можно решить:

вы можете создать ограничение маршрута, чтобы указать движку маршрутизации, что если у вас есть что-то в url-адресе, которое выглядит как число (123), то это параметр действия для действия по умолчанию, и если у вас есть что-то, что не похоже на число (AnotherAction), то это действие.

рассмотрим этот код:

routes.MapRoute(
  "MyController", "MyController/{productId}", 
  new {controller="My", action="Index"}, 
  new {productId = @"\d+" });

это определение маршрута будет соответствовать только числовым значениям после MyController в http://mysite/MyController/123 так это не будет мешать вызову другого действия на том же контроллере.

источник: создание ограничения маршрута


Если вы сохраняете имя переменной, чтобы оставаться ID, вам не нужно ничего менять.

переименуйте post one в "PostIndex" и добавьте этот атрибут:

[ActionName("Index")]

тот же вопрос на SO здесь.

хорошо, вот ответ вырезать / вставить для вас, если это поможет.

public ActionResult Index()    {        
return View();    
}    
[AcceptVerbs(HttpVerbs.Post), ActionName("Index")]   
public ActionResult PostIndex(SomeFormData data)    {        
return View();    
}

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

    // /MyController/AnotherAction
    routes.MapRoute(
        null,
        "MyController/AnotherAction",
        new { controller = "DefaultPage", action = "AnotherAction" }
    );

    // /MyController
    // /MyController/id
    routes.MapRoute(
        null,
        "MyController/{id}",
        new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional }
    );

ps. Маршруты по умолчанию как /MyController / id должен отображаться наконец.


Я думаю, вы хотите вернуть тот же вид, но вам нужно понять, что вы делаете две разные вещи. Один-receive post, а другой-доступ по get, а другой-доступ по get и параметру...

вы должны сделать 3 actionresult с разными именами и вернуть тот же вид, что и View ("ThisIsTheResult")