2010-06-14 7 views
0

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

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

Доступ метод действий для первого с HTTP GET возвращает страницу входа в систему, где-как второй делает некоторые вещи федеративной аутентификации. Я определил два метода контроллера:

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

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

EDIT: Я временно решил проблему с помощью селектора действий. Это лучший подход?

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; 
    } 
} 

ответ

0

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

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

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)} 
); 
Смежные вопросы