MVC在回发后更改路由

时间:2015-07-24 08:27:44

标签: asp.net-mvc asp.net-mvc-routing partial-views

我有一个返回这样的数据的动作,

return _aPartialPopupView(model)

代码流后,网站路由更改为

../User/_aPartialPopupView

但我想将此路线更新为

../User/
动作调用后

,因为它应该重定向到索引操作

我认为这是https://stackoverflow.com/a/19090444/914284回答我的问题,但应该有更明确的方式挂断

1 个答案:

答案 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);
    }