0

我有一个默认路由,所以如果我去 www.domain.com/app/ 它是例如 HomeController。我对控件有另一个操作,例如 helloworld,但如果我转到 www.domain.com/app/helloworld,它会失败并显示 404(毫无疑问,期待 helloworld 控制器)。

如何在默认控制器上执行非默认操作,或者如何将 url /app/helloworld 映射到 helloworld 操作。我的路由如下所示:

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

routes.MapRoute( //this fails with same 404 like it does when it's ommitted
"Hello", // Route name
"app/helloworld", // URL with parameters
new { controller = "Home", action = "HellowWorld", id = UrlParameter.Optional } // Parameter defaults
);

基本上我需要:

/app/ => 控制器 = 主页,操作 = 索引

/app/helloworld => Controller = Home,Action = HelloWorld,而不是 Controller = HelloWorld,Action - Index

/app/other => 控制器 = 其他,操作 = 索引

4

2 回答 2

2

routes将全局文件中的 2 替换为:

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

然后验证您的HomeController包含:

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

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

这样做的目的是yoursite.com/app/ANYCONTROLLER/ANYACTION将路由到控制器和操作(只要它们存在),默认new { controller = "Home", action = "Index"意味着如果有人去yoursite.com/app/它将自动路由到yoursite.com/app/Home/Index.

如果这不起作用,请尝试删除app/它,它看起来像:

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

你所拥有的看起来你正在尝试路由yoursite.com/Home/Index,而第二条路由的措辞是错误的,我不确定它会做什么,但"app/helloworld它应该看起来像"app/HelloWorld/{action}/{id}"thennew { controller = "Home", action = "HellowWorld"会起作用。这样如果有人去yoursite.com/app它就会自动显示yoursite.com/app/Home/HelloWorld。希望这有助于澄清一些事情。

这就是你想要的答案

出于某种原因,您不想为 hello world 部分创建新控制器,文件RegisterRoutes中的Global内容应如下所示:

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

        routes.MapRoute(
            "Hello World", // Route name
            "App/HellowWorld/{id}", // URL with parameters
            new { controller = "Home", action = "HelloWorld", id = UrlParameter.Optional }
            );

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

虽然我不建议这样做。

于 2012-08-18T04:47:01.823 回答
0

你应该只需要一条路线。与其对操作进行硬编码,不如将其设为变量,但包含默认值:

routes.MapRoute( //this fails with same 404 like it does when it's ommitted
    "Hello", // Route name
    "app/{action}", // URL with parameters
    new { controller = "Home", action = "HelloWorld", id = UrlParameter.Optional } 
);

这样,当您访问www.domain.com/app/时,它将获得默认操作(HelloWorld)。但是您仍然可以将路由中的操作指定为www.domain.com/app/someotheraction

另外,请记住选择了第一个匹配的路由......所以您应该考虑将默认路由移到最后,或者完全不使用它。在示例www.domain.com/app/helloworld中,它匹配默认路由,其中​​ app作为控制器,helloworld作为操作(这当然是无效的,因此是 404)。

于 2012-08-18T04:19:32.890 回答