Ответ 1
Вот так:
routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... });
ActionResult MyAction(string tags) {
foreach(string tag in tags.Split("/")) {
...
}
}
Мне нужна реализация, где я могу получить бесконечные параметры на моем ASP.NET-контроллере. Будет лучше, если я приведу вам пример:
Предположим, что у меня будут следующие URL:
example.com/tag/poo/bar/poobar
example.com/tag/poo/bar/poobar/poo2/poo4
example.com/tag/poo/bar/poobar/poo89
Как вы можете видеть, после example.com/tag/
он получит бесконечное количество тегов, а слэш будет здесь разделителем.
На контроллере я хотел бы сделать это:
foreach(string item in paramaters) {
//this is one of the url paramaters
string poo = item;
}
Есть ли какой-либо известный способ достичь этого? Как я могу получить значения от контроллера? С помощью Dictionary<string, string>
или List<string>
?
ПРИМЕЧАНИЕ.
Вопрос не очень хорошо объяснен ИМО, но я старался изо всех сил подходить к нему. в. Не стесняйтесь настраивать его
Вот так:
routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... });
ActionResult MyAction(string tags) {
foreach(string tag in tags.Split("/")) {
...
}
}
Уловка все даст вам необработанную строку. Если вы хотите более элегантный способ обработки данных, вы всегда можете использовать собственный обработчик маршрута.
public class AllPathRouteHandler : MvcRouteHandler
{
private readonly string key;
public AllPathRouteHandler(string key)
{
this.key = key;
}
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var allPaths = requestContext.RouteData.Values[key] as string;
if (!string.IsNullOrEmpty(allPaths))
{
requestContext.RouteData.Values[key] = allPaths.Split('/');
}
return base.GetHttpHandler(requestContext);
}
}
Зарегистрируйте обработчик маршрута.
routes.Add(new Route("tag/{*tags}",
new RouteValueDictionary(
new
{
controller = "Tag",
action = "Index",
}),
new AllPathRouteHandler("tags")));
Получить теги в виде массива в контроллере.
public ActionResult Index(string[] tags)
{
// do something with tags
return View();
}
Это называется catch-all:
tag/{*tags}
На всякий случай, когда кто-то приходит к этому с MVC в .NET 4.0, вам нужно быть осторожным , где вы определяете свои маршруты. Я с радостью ходил в global.asax
и добавлял маршруты, как предлагалось в этих ответах (и в других учебниках), и никуда не денутся. В моих маршрутах все по умолчанию были {controller}/{action}/{id}
. Добавление дополнительных сегментов в URL-адрес дало мне ошибку 404. Затем я обнаружил файл RouteConfig.cs в папке App_Start. Оказывается, этот файл вызывается global.asax
в методе Application_Start()
. Итак, в .NET 4.0 убедитесь, что вы добавили туда свои настраиваемые маршруты. Эта статья прекрасно описывает ее.