Asp.net mvc 3 如何将querystring?Action=Blah映射到MVC3路由中的Action?
我想在querystring中使用带有操作的路由 所以我可以在客户端使用相对URLAsp.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
有没有一种简单的方法可以实现这一点?您可以看一看,其中说明了一种可以实现这一点的技术。它使用了一个自定义 如果您真的想在全球范围内执行此操作,另一种可能是编写自定义路由,如下所示:
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