【问题标题】:How to make one controller the default one when only action specified?仅指定操作时,如何使一个控制器成为默认控制器?
【发布时间】:2015-04-01 08:30:39
【问题描述】:

我使用的是 MVC 2013 的标准 MVC 模板。

有一个Home 控制器,其中包含关于、联系等操作。

有一个Account 控制器,带有登录、注销等操作。

应用部署在域website。 urlhttp://website会产生/Home/Index的输出,不会改变浏览器地址框中的url,即浏览器显示的不是Http重定向的结果。

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

原因是我想要http://website/abouthttp://website/contact 等没有主页。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

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

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

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

更好的解决方案是创建一个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() }
);

MSDN

【讨论】:

  • 谢谢。路线约束的东西太复杂了,超出了我的范围。来不及了解它以确定是否还有其他副作用。第一个选项适合我。对于那些具有默认“文档”的控制器,我可以在 ShortUrlToHomeActions 之前为其添加一个路由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2013-06-01
  • 2016-04-03
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多