0

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

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

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

ETC

实现这一点的直接方法是为每个页面设置一个控制器,并使用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

然后让我更新路由以实现我想要的。

4

2 回答 2

0

关于控制器的使用,我认为最佳实践是为动作域或内容域使用特定的控制器,而不是根据主菜单的层次结构。

例如:

您的主页:

foo.com

控制器 -> 主页

方法 -> 索引

参数 -> 空

foo.com/news/2

控制器 -> 新闻

方法 -> 索引

参数 -> 2

但是 Home 和 News 是两个不同的“平等”控制器,只是碰巧用户与之交互的第一个控制器是 Home 控制器。

于 2013-02-03T12:25:51.877 回答
0

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

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

希望这可以帮助。

于 2013-02-03T20:43:23.587 回答