ASP.NET MVC - 从URL中删除控制器名称

Jam*_*mes 41 asp.net-mvc

我想从我的URL中删除控制器名称(对于一个特定的控制器).例如:

http://mydomain.com/MyController/MyAction

我希望将此URL更改为:

http://mydomain.com/MyAction

我将如何在MVC中执行此操作?我正在使用MVC2,无论如何这对我有帮助.

rre*_*ejc 48

您应该在global.asax中映射新路由(在默认值之前添加它),例如:

routes.MapRoute("SpecificRoute", "{action}/{id}", new {controller = "MyController", action = "Index", id = UrlParameter.Optional});

// default route
routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional} );
Run Code Online (Sandbox Code Playgroud)


nii*_*ico 23

要在2016/17/18更新此内容 - 最好的方法是使用属性路由.

在RouteConfig.cs中执行此操作的问题在于旧路由仍然可以工作 - 因此您将同时拥有这两个路径

http://example.com/MyController/MyAction

http://example.com/MyAction

拥有多个到同一页面的路线对于搜索引擎优化是不利的 - 可能导致路径问题,并在整个应用程序中创建僵尸页面和错误.

使用属性路由可以避免这些问题,并且可以更容易地查看哪些路由.您所要做的就是将其添加到RouteConfig.cs(可能在其他路径匹配之前位于顶部):

routes.MapMvcAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)

然后将路由属性添加到具有路由名称的每个操作,例如

[Route("MyAction")]
public ActionResult MyAction()
{
...
}
Run Code Online (Sandbox Code Playgroud)

  • 这个!谢谢@niico!这正是对我有用的,也是我需要的! (2认同)

Rah*_*hul 5

这是从 HomeController 中删除控制器名称的步骤

步骤 1: 创建路由约束。

public class RootRouteConstraint<T> : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
        return rootMethodNames.Contains(values["action"].ToString().ToLower());
    }
}
Run Code Online (Sandbox Code Playgroud)

第 2 步:
在使用我们刚刚创建的路由约束的默认映射之上添加一个新的路由映射。通用参数应该是您计划用作“根”控制器的控制器类。

routes.MapRoute(
    "Root",
    "{action}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { isMethodInHomeController = new RootRouteConstraint<HomeController>() }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

现在您应该可以像这样访问您的家庭控制器方法:example.com/about、example.com/contact

这只会影响 HomeController。所有其他控制器将具有默认路由功能。