Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC具有任意深度的动态路由和操作链接_C#_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

C# ASP.NET MVC具有任意深度的动态路由和操作链接

C# ASP.NET MVC具有任意深度的动态路由和操作链接,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,我想用ASP.NET MVC制作一个论坛/留言板。在这些类型的论坛上很常见的是层次化的董事会类别,例如: -一般性讨论 -技术支持 --网站技术支持 --产品技术支持 ---产品A技术支持 ---产品B技术支持 每个类别下面都是主题,消息属于这些主题。我主要关心的是1.)在给定URL的情况下找到正确的位置,2.)在URL中不包含大量不必要的信息,以及3.)能够从代码中重新创建URL 我希望URL是这样的: mysite.com/Forum/ - forum index mysite.com/Fo

我想用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 mysite.com/Forum/-论坛索引 mysite.com/Forum/General-Discussion/-董事会“一般讨论”索引 mysite.com/Forum/Technical-Support/Product/Product-A/-产品A技术支持的董事会索引 mysite.com/Forum/Technical-Support/Website/Topic1004/-在“网站技术支持”栏中ID为1004的主题索引 mysite.com/Forum/Technical-Support/Website/Topic1004/3-主题第3页,ID为1004 现在,我已经从中排除了动作名称,因为它们可以根据我所在的位置推断出来。我数据库中的每个Board实体都有一个“UrlPart”列,该列已编制索引,因此我希望能够对该表进行相对快速的查询,以确定我的位置

问题是:为了找出正确的位置,我应该使用自定义路由处理程序、自定义路由绑定器,还是只创建模糊的路由规则

这个建议看起来很好,但也像是做了很多工作,但收效甚微:

这似乎表明创建模型绑定会更容易:


为了实现#3,我必须创建自己的自定义URL生成逻辑,对吗?

如果您需要深度和/或不一致的URL,我建议您使用基于属性的路由,如讨论的解决方案

我更喜欢基于属性的方法,而不是将每个路由都放在应用程序_Start中,因为您有更好的引用位置,这意味着路由规范和处理它的控制器非常接近

下面是您的控制器操作如何使用我实现的UrlRoute框架(可在上获得)查找您的示例:


使用这种方法,您可以使用与使用默认路由处理程序手动添加路由时相同的帮助程序(Url.Route*,Url.Action*)生成出站Url,无需额外工作。

您可以让它们全部转到一个控制器操作,该操作通过手动拆分url的其余部分来为您处理路由处理,并调用BLL上的某个方法,然后将任务委托给其他方法,最后根据您的需要返回视图()。

谢谢DSO,但这并不是我想要的;你可以想象人们创建各种形式的中间区域论坛。我在URL中所需要的只是/论坛标记,以便知道如何封送到论坛控制器;以及可选的主题ID和页码,以指示我是否要转到索引、图板或主题。我希望董事会的名字在那里搜索引擎优化的原因。可以说,我只能让当前的板成为URL的一部分,但是把它的一部分咬掉并不能遵守进入父部分的其余原则。好吧,也许我把你的例子看得太字面了。你是说你希望URL的整个中间部分完全是自由形式的,绝对没有预定义的结构?是的。部分原因是我想让我的URL从数据库中获取它们的结构。这似乎起作用了。。。今天晚些时候我会发布我的想法。嘿,罗布,很抱歉把这个挖出来。有没有可能,如果你能发布一些代码,说明你是如何实现它的?感谢我一直在考虑的一件事是在运行时动态填充路由表——基于数据库构建路由。这行得通吗?我回答了一个类似的问题,也许这也能帮助你。我在此期间所做的是根据车载ID动态创建路由。我不知道路由处理程序会为我做这件事,因为它们实际上并没有帮助构建路由,但这似乎是一种很好的方法来处理它们。谢谢@布拉德·拉森:在事实发生五年后将其标记为重复似乎有点站不住脚,特别是当你看看“被问”的时间戳时,我的问题首先被问到。这个问题:问2009年6月19日;此问题与2009年6月21日的问题相同:-X现在去发明我的时间机器……@Rob-你已经把chris166的答案(现在转换成评论)标记为这个问题的公认答案。答案只是指向另一个问题的答案。这似乎表明你认为你的问题最好用这个答案来回答,所以当社区将克里斯166的答案标记为“不是答案”时,指导那里的人似乎是有道理的。如果人们觉得新问题提供了更好的答案,旧问题可以作为新问题的副本关闭。
[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)
{
    ...
}