首页 新闻 会员 周边

MVC中使用MapPageRoute注册路由后,RedirectToAction路由错误

0
悬赏园豆:20 [已解决问题] 解决于 2013-03-14 20:37

在mvc中使用MapPageRoute注册路由,如下:

routes.MapPageRoute("test", "test", "~/test.aspx");
routes.MapRoute(
              "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
               new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );

然后在Controller中使用RedirectToAction,转向会错误,如下代码:

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "欢迎使用 ASP.NET MVC!";

            return RedirectToAction("About");
        }

        public ActionResult About()
        {
            return View();
        }
    }

RedirectToAction("About");这句执行后,会重定向到test.aspx页面,为什么会这样呢?

何时能出头的主页 何时能出头 | 初学一级 | 园豆:136
提问于:2013-03-11 20:51
< >
分享
最佳答案
0

顺序反了

 


routes.MapRoute(
              "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
               new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );

routes.MapPageRoute("test", "test", "~/test.aspx");
收获园豆:20
陈希章 | 老鸟四级 |园豆:2538 | 2013-03-11 21:04

如果反过来,我请求http://localhost:2775/test就不会转到test.aspx页面了,我想实现请求http://localhost:2775/test时转到test.aspx页面,其他路径转向对应的Controller实现

何时能出头 | 园豆:136 (初学一级) | 2013-03-11 22:45

@何时能出头: 呵呵,昨天没有注意。这个问题的原因在于MapPageRoute其实主要是给Web Forms用的,它会与MVC默认注册的路由规则有些冲突。参考这里一个讨论http://stackoverflow.com/questions/10178276/after-add-mappageroute-to-an-asp-net-mvc-project-the-site-stops-to-enter-in-hom  

一个解决方案就是添加一个约束,示例代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("test", "test", "~/test.aspx", false, null, new RouteValueDictionary { { "outgoing", new MyCustomConstraint() } });

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

 

}
}

public class MyCustomConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return routeDirection == RouteDirection.IncomingRequest;
}
}
}

陈希章 | 园豆:2538 (老鸟四级) | 2013-03-12 07:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册