如何强制MVC路由到Home/Index而不是根目录?

8
2个回答

6
Url.Action() 使用路由生成 URL。所以,如果您想要更改它,必须更改该内容。目前它显示默认控制器是Home,默认操作是Index。将它们更改为其他任何内容,应该会给您提供不同的 URL。

例如,您的路由配置可能如下所示:

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

将默认值更改为其他任何值或删除它们:

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

请注意,这样做意味着您的页面只能通过完整的控制器/操作路径访问,因此您可能需要创建一个登陆页面并将其设置为默认页面。
如果您绝对需要知道操作的完整URL,则可以按照以下方式进行。首先创建一个额外的路由并将其放在路由配置的底部。这个路由不会被系统默认使用。
routes.MapRoute(
    name: "AbsoluteRoute",
    url: "{controller}/{action}/{id}",
    defaults: new { id = UrlParameter.Optional }
);

然后在代码中,您可以调用此方法(不确定在 Razor 中是否可用,但编写一个帮助器方法应该很容易):

var fullURL = UrlHelper.GenerateUrl("AbsoluteRoute", "Index", "Home", null, null, null, null, System.Web.Routing.RouteTable.Routes, Request.RequestContext, false);

好的,我会更新,但这可能是个坏主意,特别是对于搜索引擎优化来说。 - DavidG
1
仍然意味着您有多个URL指向同一页,但是您是老板! :) - DavidG
太好了!UrlHelp.GenerateUrl在Razor中可用,正是我所需要的。谢谢。 - Mark Erasmus
使用这种方法,是否有一种方式可以呈现/Home而不是/Home/Index?我尝试为AbsoluteRoute设置默认控制器,但没有起作用。 - Mark Erasmus
1
如果您的路由具有默认操作而非控制器,则应该可以工作。 - DavidG
显示剩余3条评论

1
您可能需要在默认路由之前创建一个特定的 Home/Index 路由。然后可以将默认路由和 Home/Index 路由指向同一位置。但是,如果您进入基本路由,这将不会重定向您到 Home/Index...因此,您需要添加URL重定向,可以在 IIS 级别(有相应的设置)添加或者只需在您的 Index 页面中添加代码来查看 URL 并重定向到完整的 URL。

另外,您还可以取消默认控制器和操作值,然后在 IIS 配置中添加 URL 重定向,以便在访问根路径时将其重定向到完整路径。


嗯,有趣的方法。虽然我使用了纯MVC,但我认为我已经理解了它,仍然值得一加。 - DavidG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接