我有一个HomeController,并且其中包含许多动作。我希望用户无需输入“主页”即可访问我的操作。这是下面的路线

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


我希望用户不要输入控制器名称,在这种情况下为Home。我怎样才能做到这一点?还是强制性的?

最佳答案

解决方案01(属性路由)

在RouteConfig中其他路由的顶部添加以下行

        routes.MapMvcAttributeRoutes();


然后根据需要在每个操作的顶部添加属性路由。 (在这种情况下,家庭控制器中的操作)
例如。下面的代码示例将从http://site/Home/About中删除“ / Home”,并在http://site/About上提供

[Route("About")]
public ActionResult About()
{


解决方案02(使用路由约束)[Source]

如下所示将新的路由映射添加到RouteConfig。 (请记住,在默认(通用)路由之前添加这些特定的路由。

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


这将从“ Home”控制器的所有动作(路径)中删除“ Home”
RootRouteConstraint类

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());
    }
}


可选信息:此行(约束)将确保仅对HomeController应用此路由

new { isMethodInHomeController = new RootRouteConstraint<HomeController>

关于c# - 如何从Mvc中的HomeController中删除Home,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40445140/

10-10 09:43