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

#asp.net #asp.net-mvc #parameters #routing

#asp.net #asp.net-mvc #параметры #маршруты

Вопрос:

Привет, как мне сопоставить URL ../Companies/Results /value / id, когда оба параметра необязательны?

Companies — это контроллер, Results — действие, значение и id — необязательные параметры. В моей форме есть текстовое поле для значения и список выбора для идентификатора. Пользователь мог выбрать оба или по одному из них для поиска. Пробовал что-то подобное, но не могу справиться, когда отсутствует один из необязательных параметров, скажем значение, например ../Companies/Results / /id

         routes.MapRoute(
            "Company Profession", // Route name
            "{action}/{value}/{profId}", // URL with parameters
            new { controller = "Companies", action = "Index", value = UrlParameter.Optional, profId = UrlParameter.Optional } // Parameter defaults
        );

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

Ответ №1:

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

Я предполагаю, что вы создаете URL-адрес с помощью javascript, поскольку использование действия GET form приведет к добавлению имен параметров к URL-адресу. В этом случае, когда текстовое поле пустое, просто вставьте byid по умолчанию.

Обновите свой маршрут, включив в него значение по умолчанию, чтобы все сгенерированные вами URL-адреса работали. Альтернативный способ обработки генерации URL-адресов с двумя «необязательными» параметрами см. В сообщении в блоге Фила Хаака об этом.

 // used when both parameters are specified
routes.MapRoute(
        "Company Profession", // Route name
        "{action}/{value}/{profId}", // URL with parameters
        new { controller = "Companies", action = "Index", value ="byid", profId = UrlParameter.Optional } // Parameter defaults
);
  

Ответ №2:

Спасибо, ребята, только что обнаружил ограничения маршрута для integer. И вот, повозившись с некоторыми комбинациями маршрутов, кажется, все работает так, как я хочу :

         routes.MapRoute(
           "Detail", // Route name
           "{action}/{value}", // URL with parameters
           new { controller = "Companies", action = "Detail" }, // Parameter defaults
           new { value = @"d " } //integer only
        );

        routes.MapRoute(
            "Company   Profession", // Route name
            "{action}/{value}/{profId}", // URL with parameters
            new { controller = "Companies", action = "Results" }, // Parameter defaults
            new { profId = @"d " } //integer only
        );

        routes.MapRoute(
            "Profession", // Route name
            "{action}/{profId}", // URL with parameters
            new { controller = "Companies", action = "Results"}, // Parameter defaults
            new {profId = @"d " } //integer only
        );

        routes.MapRoute(
           "Company", // Route name
           "{action}/{value}", // URL with parameters
           new { controller = "Companies", action = "Results" } // Parameter defaults
       );

        routes.MapRoute(
            "RootFolder", // Route name
            "{action}/{value}", // URL with parameters
            new { controller = "Companies", action = "Index", value = UrlParameter.Optional } // Parameter defaults
        );
  

Ответ №3:

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

 routes.MapRoute(
            "Company Profession", // Route name
            "Companies/{action}/value-{value}/id-{profId}", // URL with parameters
            new { controller = "Companies", action = "Index", value = UrlParameter.Optional, profId = UrlParameter.Optional } // Parameter defaults
        );