我有一个返回这样的数据的动作,
return _aPartialPopupView(model)
代码流后,网站路由更改为
../User/_aPartialPopupView
但我想将此路线更新为
../User/
动作调用后,因为它应该重定向到索引操作
我认为这是https://stackoverflow.com/a/19090444/914284回答我的问题,但应该有更明确的方式挂断
答案 0 :(得分:1)
让我们得到一条这样的路线。
routes.MapRoute("old", "foo/{controller}/{action}/{id}");
以及使用这种方法的方法
var new = routes.MapRoute("new", "bar/{controller}/{id}/{action}");
var old = routes.MapRoute("new", "foo/{controller}/{action}/{id}");
routes.Redirect(old).To(new);
MapRoute方法创建路线。或者,我们可以做到这一点:
var new = routes.MapRoute("new", "bar/{controller}/{id}/{action}");
var throwAway = new RouteCollection();
var old = throwAway.MapRoute("new", "foo/{controller}/{action}/{id}");
routes.Redirect(old).To(new);
GetNewRouteData的实现,这是匹配传入请求时调用的方法。
public override RouteData GetNewRouteData (HttpContextBase httpContext) {
// Use the original route to match
var routeData = SourceRoute.GetNewRouteData(httpContext);
if (routeData == null) {
return null;
}
// But swap its route handler with our own
routeData.RouteHandler = this;
return routeData;
}
RedirectRoute 实现了 IRouteHandler ,因此我们应该看一下它的实现。
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
var requestRouteValues = requestContext.RouteData.Values;
var routeValues = AdditionalRouteValues.Merge(requestRouteValues);
var vpd = TargetRoute.GetVirtualPath(requestContext, routeValues);
string targetUrl = null;
if (vpd != null) {
targetUrl = "~/" + vpd.VirtualPath;
return new RedirectHttpHandler(targetUrl, Permanent, isReusable: false);
}
return new DelegateHttpHandler( httpContext => httpContext.Response.StatusCode = 404, false);
}