Asp.net mvc 3 如何将querystring?Action=Blah映射到MVC3路由中的Action?

Asp.net mvc 3 如何将querystring?Action=Blah映射到MVC3路由中的Action?,asp.net-mvc-3,Asp.net Mvc 3,我想在querystring中使用带有操作的路由 所以我可以在客户端使用相对URL 有没有一种简单的方法可以实现这一点?您可以看一看,其中说明了一种可以实现这一点的技术。它使用了一个自定义 如果您真的想在全球范围内执行此操作,另一种可能是编写自定义路由,如下所示: public class MyRoute : Route { public MyRoute(string url, object defaults) : base(url, new RouteValueDic

我想在querystring中使用带有操作的路由

所以我可以在客户端使用相对URL


有没有一种简单的方法可以实现这一点?

您可以看一看,其中说明了一种可以实现这一点的技术。它使用了一个自定义

如果您真的想在全球范围内执行此操作,另一种可能是编写自定义路由,如下所示:

public class MyRoute : Route
{
    public MyRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        var action = httpContext.Request["action"];
        if (rd != null && !string.IsNullOrEmpty(action))
        {
            rd.Values["action"] = action;
        }
        return rd;
    }
}
然后注册:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add(
        "Default", 
        new MyRoute(
            "{controller}/{id}", 
            new { controller = "Home", id = UrlParameter.Optional }
        )
    );
}

现在,当您请求
/home?action=about
时,将执行
home
控制器的
about
操作。显然,如果您在请求中省略
action
参数,您将得到一个异常,因为必须始终指定路由的
action
标记,否则操作调用程序将不知道要执行哪个操作。

Darin提供的解决方案足够好和有用,但是
Html.ActionLink
没有提供的
action
有一个问题,例如
Index
操作会导致如下错误:

public class MyRoute : Route
{
    public MyRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        var action = httpContext.Request["action"];
        if (rd != null && !string.IsNullOrEmpty(action))
        {
            rd.Values["action"] = action;
        }
        return rd;
    }
}
RoutedData必须包含一个名为“action”的项,该项的值为非空 字符串值

因此,您必须将
MyRoute
更改为以下内容:

public class MyRoute : Route {

    public MyRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler()) { }

    public override RouteData GetRouteData(HttpContextBase httpContext) {

        var routeData = base.GetRouteData(httpContext);
        var action = httpContext.Request["action"];
        if (routeData != null && !string.IsNullOrEmpty(action)) {
            routeData .Values["action"] = action;
        } 

        // you have to add something like this:
        else {      
            routeData .Values["action"] = "Index";
        }
        return routeData;
    }

} 
我使用这个解决方案:

public override RouteData GetRouteData(HttpContextBase httpContext) {
    var routeData = base.GetRouteData(httpContext);
    string action = httpContext.Request.QueryString["Action"];
    routeData.Values["action"] = String.IsNullOrEmpty(action) ? "Index" : action;
    return routeData;
}//method
但要完成此任务,还必须实现GetVirtualPath():

这确保了ActionLink()等帮助程序将生成正确的URL