具有可空类型的查询字符串路由

时间:2010-06-14 20:02:05

标签: asp.net-mvc-2 asp.net-mvc-routing

我正在接受其中一个编码器的封锁日。我应该知道这一点,但我会请求一点帮助。我有两条路线:

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

使用HTTP GET访问第一个的Action方法将返回登录页面 - 其中第二个执行一些联合身份验证。我定义了两种控制器方法:

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 :(得分: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)}
);