如何将URL的控制器段发送到ASP.NET MVC控制器

时间:2012-02-12 09:17:32

标签: asp.net-mvc routes global-asax

我正在尝试使用HttpContext.Current.Request.RawUrl在global.asax文件中获取页面请求的网址段。我的代码如下:

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

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { controller = "Home|Account" }
    );

    var url = HttpContext.Current.Request.RawUrl;
    var pageTitle = url.Split('/')[1];

    routes.MapRoute(
        "SendToCustomController",
        "{*url}",
        new { controller = "Custom", action = "Index", title = pageTitle }
    );
}

如果我第一次输入devserver:1234 / test等地址,我会将字符串'test'发送到控制器。问题是,在后续请求中有不同的段,例如devserver:1234 / confused,我仍然会将'test'发送到控制器。

这样做的目的是对于没有指定控制器的任何请求,URL的控制器段将传递给自定义页面控制器,该控制器将查看DB中是否有任何用户生成的页面具有该标题。如果有,则会加载页面,如果没有标准404将被抛出。

任何帮助解决上述问题,或者更好的方法来实现这一目标都会很棒!

1 个答案:

答案 0 :(得分:1)

您的路由令牌在注册中被称为{url},然后您使用了一些title = pageTitle约束,我不知道它来自哪里(实际上它在您的RegisterRoutes静态方法中是硬编码的,显然是运行的对于第一个命中它的应用程序,应用程序的整个生命周期只有一次)。您应该避免访问HttpContext方法中相关的任何Application_Start。如果你在IIS7 +集成管道模式下运行,那甚至都不允许。

请尝试以下方法:

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

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { controller = "Home|Account" }
    );

    routes.MapRoute(
        "SendToCustomController",
        "{*url}",
        new { controller = "Custom", action = "Index" }
    );
}

然后:

public class CustomController : Controller
{
    public ActionResult Index(string url)
    {
        // TODO: do your checks here based upon the url parameter
        // and return HttpNotFound(); in case it doesn't match anything
    }
}