我正在组建一个简单的宣传册网站,并决定使用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
然后我会更新路由以实现我想要的目标。
答案 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());
}
}
希望这有帮助。