#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
);