整个ASP.NET MVC应用程序的一个控制器

时间:2010-11-09 19:53:40

标签: c# asp.net-mvc

我想为所有网站网址设置一个控制器 例如:

  • www.mysite.com/page1
  • www.mysite.com/another
  • www.mysite.com/third/some-text
  • www.mysite.com/fourth/some/some/some/some

网址会手动创建,网址也可以是“每种类型”(从某种程度上说,你必须能够将所有内容放入网址) 我不想在网址中添加控制器名称或任何内容(操作名称或ID)。

如何为此编写网址路由规则?我并不担心这种设计的缺点。 这是默认的ASP.NET MVC路由规则

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

3 个答案:

答案 0 :(得分:1)

我不会告诉你这是一个糟糕的计划。但它是。无论如何,如果你不需要处理无限的url文件夹深度,诀窍就是以相反的顺序运行:

       //maps virtual redirects
        routes.MapRoute("virtual redirects",
                        "{redirect}",
                        new
                        {
                            area = "",
                            controller = "Content",
                            action = "VirtualRedirect"
                        }
            );

        routes.MapRoute("two level",
                        "{firstPart}/{secondPart}",
                        new
                        {
                            area = "",
                            controller = "Content",
                            action = "PageUrl",
                            thirdPart = ""
                        }
                        );

        //maps general content pages
        routes.MapRoute("page catcher",
                        "{firstPart}/{secondPart}/{thirdPart}",
                        new
                        {
                            area = "",
                            controller = "Content",
                            action = "PageUrl"
                        }
            );

请注意,您需要在此之上放置任何更具体的路由,并且您仍然需要在此之后声明的默认路由,以便MVC的某些部分能够正常工作。

答案 1 :(得分:1)

我认为你可以这样做,只需覆盖routHandler

        routes.MapRoute(
            "dbroute",
            "{controller}/{action}/{id}",
            new { id = "" }
            ).RouteHandler = new MyRouteHandler();

和你这样的新路线处理程序

public class MyRouteHandler : IRouteHandler 
{

    #region IRouteHandler Members

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        IRouteHandler handler = new MvcRouteHandler();
        var vals = requestContext.RouteData.Values;
        if (vals["controller"] != null && 
        (vals["controller"].ToString() == "page1" ||
        vals["controller"].ToString() == "another" ||
        vals["controller"].ToString() == "others" ) )
        {

            vals["controller"] = "Test";// your controller; 
            vals["action"] = "Index";//your action 
        }
        return handler.GetHttpHandler(requestContext);
    }


    #endregion
}

答案 2 :(得分:0)

伊戈尔,

除非有一个非常令人信服的理由这样做,否则我会考虑使用其他方式来展示您想要的网址,并考虑每个逻辑单元正在执行的“隐蔽”功能。我回答了一个类似的问题,我回答:

What is the advantage of using multiple Controller classes in ASP.NET MVC?

可能会给你一些想法。