Asp.net mvc 3 MVC 3-多个控制器或具有多个操作和路由的控制器

Asp.net mvc 3 MVC 3-多个控制器或具有多个操作和路由的控制器,asp.net-mvc-3,Asp.net Mvc 3,我正在建立一个足够简单的小册子网站,并决定使用MVC3作为一个学习机会。网站某些部分的内容将存储在数据库中,管理员可以通过简单的GUI进行更新。我决定不再使用预构建的CMS来学习如何用这种对我来说是新的语言进行数据库操作 我想要一个非常简单的URL结构: foo.com (home) foo.com/bio foo.com/news foo.com/about foo.com/events 等 实现这一点的简单方法是为每个页面使用一个控制器,并使用每个控制器的Index()ActionResu

我正在建立一个足够简单的小册子网站,并决定使用MVC3作为一个学习机会。网站某些部分的内容将存储在数据库中,管理员可以通过简单的GUI进行更新。我决定不再使用预构建的CMS来学习如何用这种对我来说是新的语言进行数据库操作

我想要一个非常简单的URL结构:

foo.com (home)
foo.com/bio
foo.com/news
foo.com/about
foo.com/events

实现这一点的简单方法是为每个页面使用一个控制器,并使用每个控制器的
Index()
ActionResult

为站点的每个页面配备一个控制器是否合适/最佳做法?新闻和事件没有子页面,但可能有分页,URL看起来像

foo.com/news/
foo.com/news/page2
foo.com/news/page3
foo.com/news/page4
如果我有一个控制器,并且使用了多个操作,那么默认情况下URL看起来像

foo.com (home)
foo.com/home/bio
foo.com/home/news
foo.com/home/about
foo.com/home/events

这将使我更新路由以实现我想要的。

关于控制器的使用,我认为最好的做法是为操作域或内容域指定一个特定的控制器,而不是通过主菜单的层次结构

例如:

您的主页:

foo.com
控制器->主页

方法->索引

参数->空值

foo.com/news/2
控制器->新闻

方法->索引

参数->2


但是Home和News是两个不同的“相等”控制器,恰好用户与之交互的第一个控制器是Home控制器。

如果您想使用单个控制器,您可以尝试

routes.MapRoute(
    name: "Default",
    url: "{action}/{page}",
    defaults: new { controller = "Home", action = "Index", page = UrlParameter.Optional },
    constraints: new { page = new PagingConstraint() }
);
作为路线定义。要仅允许“新闻”和“事件”的分页,请使用自定义路由约束

public class PagingConstraint : IRouteConstraint
{
    private static readonly string[] PagingEnabledActions = new string[] { "news", "events" };

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return string.IsNullOrEmpty(values[parameterName].ToString()) || new Regex(@"^[Pp][Aa][Gg][Ee][0-9]+$", RegexOptions.Compiled).IsMatch(values[parameterName].ToString())
            && PagingEnabledActions.Contains(values["action"].ToString().ToLower());
    }
}

希望这有帮助。

并没有特别回答这个问题。