MVC 3 - 具有多个动作和路由的多个控制器或控制器

时间:2013-02-03 12:15:07

标签: asp.net-mvc-3

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

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

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

然后我会更新路由以实现我想要的目标。

2 个答案:

答案 0 :(得分:0)

关于控制器的使用,我认为最佳做法是为行动域或内容域设置一个特定的控制器,而不是主菜单的层次结构。

例如:

您的主页:

foo.com

控制器 - >家

方法 - >索引

参数 - >空

foo.com/news/2

控制器 - >消息

方法 - >索引

参数 - > 2

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

答案 1 :(得分: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());
    }
}

希望这有帮助。