Маршрутизация строки запроса с типами Nullable - PullRequest
0 голосов
/ 15 июня 2010

У меня один из дней блока кодировщика. Я должен знать это, но вместо этого я попрошу немного помощи. У меня есть два маршрута:

/Login
/Login?wa=wsignin1.0&wtrealm=http://localhost/MyApp

При доступе к методу Action для первого с помощью HTTP GET возвращается страница входа, где вторым выполняется федеративная аутентификация Я определил два метода контроллера:

public ActionResult Index();
public ActionResult Index(string wa);

Маршрутизации, конечно, не нравится это, потому что обнуляемый тип делает его неоднозначным. Как наложить на него ограничение, чтобы он выполнял только второй метод, если значение существует в данных маршрута?

РЕДАКТИРОВАТЬ: я временно решил проблему с помощью селектора метода действия. Это лучший подход?

public class QueryStringAttribute : ActionMethodSelectorAttribute
{
    public ICollection<string> Keys { get; private set; }

    public QueryStringAttribute(params string[] keys)
    {
        this.Keys = new ReadOnlyCollection<string>(keys);
    }

    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        var requestKeys = controllerContext.HttpContext.Request.QueryString.AllKeys;
        var result = Keys.Except(requestKeys, StringComparer.OrdinalIgnoreCase).Count() == 0;
        return result;
    }
}

1 Ответ

0 голосов
/ 15 июня 2010

Я сталкивался с этой проблемой много раз в прошлом, и я думаю, что это классическая проблема маршрутизации.Я сделал следующее:

Создайте свои действия в вашем контроллере:

public ActionResult Index();
public ActionResult IndexForWa(string wa);

Сделайте все, что вам нужно, в своем определении маршрутов

routes.MapRoute(
    "index_route",
    "Login"
    new {controller="Login", action="Index"}
); //This is not even necessary but its here to demo purposes

routes.MapRoute(
    "index_for_wa_route",
    "Login/wa/{wa}",
    new {controller="Login", action="Index", wa = {wa)}
);
...