仅指定操作时如何将一个控制器设置为默认控制器?

2023-12-06

我正在使用 MVC 2013 中的标准 MVC 模板。

有一个Home具有“关于”、“联系”等操作的控制器。

有一个Account具有登录、注销等操作的控制器

该应用程序部署在域中website。网址http://网站将产生 /Home/Index 的输出,而不改变浏览器地址框中的 url,即浏览器显示的不是 Http 重定向的结果。

我如何制作网址http://网站/X如果 X 不是我的应用程序中的另一个控制器,路由到 /Home/X ?否则它应该路由到/Home/X/Index。

原因是我想http://网站/关于, http://网站/联系方式等没有主页。


一个简单的解决方案是简单地在默认(包罗万象)之上定义一个新路由,如下所示:

routes.MapRoute(
    name: "ShortUrlToHomeActions",
    url: "{action}",
    defaults: new { controller = "Home" }
);

这种方法的问题是它会阻止访问Index其他控制器的(默认操作)(请求/Other, 当你有OtherContoller with Index操作将导致 404,请求/Other/Index会工作)。

更好的解决方案是创建一个RouteConstraint这将匹配我们的/{action}仅在没有其他同名控制器的情况下:

public class NoConflictingControllerExists : IRouteConstraint
{
    private static readonly Dictionary<string, bool> _cache = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var path = httpContext.Request.Path;

        if (path == "/" || String.IsNullOrEmpty(path))
            return false;

        if (_cache.ContainsKey(path))
            return _cache[path];

        IController ctrl;

        try
        {
            var ctrlFactory = ControllerBuilder.Current.GetControllerFactory();
            ctrl = ctrlFactory.CreateController(httpContext.Request.RequestContext, values["action"] as string);
        }
        catch
        {
            _cache.Add(path, true);
            return true;
        }

        var res = ctrl == null;
        _cache.Add(path, res);

        return res;
    }
}

然后应用约束:

routes.MapRoute(
    name: "ShortUrlToHomeActions",
    url: "{action}",
    defaults: new { controller = "Home" },
    constraints: new { noConflictingControllerExists = new NoConflictingControllerExists() }
);

See MSDN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅指定操作时如何将一个控制器设置为默认控制器? 的相关文章

随机推荐