我想用ASP.NET MVC组建一个论坛/留言板。在这些类型的论坛上很常见的是分层板类别,例如:
- 一般性讨论
- 技术支持
- 网站技术支持
- 产品技术支持
---产品A技术支持
---产品B技术支持
然后,每个类别下面都有主题和消息属于这些主题。我主要关注的是1.)到达正确的位置,给定URL,2。)不包括我的URL中的大量不必要的信息,以及3.)能够从代码重新创建URL。
我想要一个这样的URL:
mysite.com/Forum/ - forum index mysite.com/Forum/General-Discussion/ - board index of "general discussion" mysite.com/Forum/Technical-Support/Product/Product-A/ - board index of "Product A Tech Support" mysite.com/Forum/Technical-Support/Website/Topic1004/ - Topic index of topic with ID 1004 in the "Website Technical Support" board mysite.com/Forum/Technical-Support/Website/Topic1004/3 - Page 3 of Topic with ID 1004
现在,我已经从中排除了动作名称,因为它们可以根据我的位置来推断。我的数据库中的每个Board实体都有一个“UrlPart”列,该列已编入索引,因此我希望能够对该表进行相对快速的查询,以确定我的位置。
问题是:为了找出正确的位置,我应该使用自定义路由处理程序,自定义路由绑定器,还是应该创建模糊的路由规则?
这个建议看起来很不错,但看起来好像很多工作效果不大: ASP.NET MVC custom routing for search
这似乎表明创建模型绑定会更容易: MVC Dynamic Routes
要实现#3,我将不得不创建自己的自定义URL生成逻辑,对吗?
答案 0 :(得分:5)
如果您需要深度和/或不符合要求的网址,我建议您使用基于属性的路由,例如讨论的解决方案here。
我更喜欢基于属性的方法而不是在Application_Start中放置每个路由,因为你有更好的引用位置,这意味着路由规范和处理它的控制器是紧密相连的。
使用我实现的UrlRoute框架(codeplex上提供),以下是您的控制器操作对您的示例的查找方式:
[UrlRoute(Path = "Forum")]
public ActionResult Index()
{
...
}
[UrlRoute(Path = "Forum/General-Discussion")]
public ActionResult GeneralDiscussion()
{
...
}
[UrlRoute(Path = "Forum/Technical-Support/Product/{productId}")]
public ActionResult ProductDetails(string productId)
{
...
}
[UrlRoute(Path = "Forum/Technical-Support/Website/{topicId}/{pageNum}")]
[UrlRouteParameterDefault(Name = "pageNum", Value = "1")]
public ActionResult SupportTopic(string topicId, int pageNum)
{
...
}
使用这种方法,您可以使用相同的帮助程序(Url.Route *,Url.Action *)生成出站URL,如果您使用默认路由处理程序手动添加路由,则可以使用这些帮助程序,无需额外的工作。
答案 1 :(得分:1)
你可以让他们全部转到一个控制器动作,通过手动拆分url的其余部分来处理路由处理,然后调用BLL上的一个方法,然后将任务委托给其他方法,最后返回一个View()根据您的需要。