ASP.NET Mvc - обнуляемые параметры и запятая в качестве разделителя - PullRequest
2 голосов
/ 11 октября 2010

Как мне определить маршрут в моем global.asax, чтобы иметь возможность использовать обнуляемые параметры и кому в качестве разделителя?

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

"{Controller}/{Action},{name},{page},{status}"

Полная запись из Global.asax:

    routes.MapRoute(
        "Search",
        "{controller}/{action},{name},{page},{status}",
            new { controller = "User", action = "Find", 
                name = UrlParameter.Optional,
                page = UrlParameter.Optional,
                status = UrlParameter.Optional  } 
    );

Подпрограмма, определенная, как указано выше, работает нормально, когда я ввожу все параметры, но когда некоторые параметры равны нулю, происходит сбой маршрутизации (например, «пользовательfind ,,, ")


Согласно комментарию Clicktricity ниже - метод действия, который передает запрос:

public ActionResult Find(string userName, int? page, int? status)
{
    // [...] some actions to handle the request

}

В начале Iтестировал маршрут с помощью отладчика VS, теперь я использую отладчик маршрута, описанный в блоге Phil's Haack .Инструмент подтверждает - что маршрутизация с нулевыми значениями не обрабатывается должным образом (или я делаю что-то не так;))

1 Ответ

4 голосов
/ 12 октября 2010

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

user/find,bob,2,live
user/find,bob,2
user/find,bob
user/find

Было бы намного проще использовать строки запросов для того, что вы пытаетесь сделать.

Редактировать на основании комментария:

Если это необходимо, вы можете попробовать сделать это таким образом (хотя это не очень хороший подход)

Измените свой путь, чтобы соответствовать

{Controller}/{Action},{*parameters}

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

Переименуйте каждое действие, которое приведет ваш полный список к чему-то другому, добавив стандартный префикс к каждому из них, что будет самым простым способом, и добавьте атрибут [NonAction]. Добавьте новый метод с исходным именем, который принимает строку, эта строка представляет собой строку переменных, разделенных запятыми. В этом методе разбить строку и вернуть исходное действие, передавая значения из разбиения.

Итак, вы идете от:

public ActionResult Find(string name, int page, string status){
    //Do stuff here
    return View(result);
}

К * * 1023

public ActionResult Find(string parameters){
    string name;
    int? page;
    string status;
    //split parameters and parse into variables
    return FindAction(name, page, status);
}

[NonAction]
public ActionResult FindAction(string parameters){
    //Do what you did in your previous Find action
    return View(results);
}
...