asp.net-mvc - 与MVC路由有问题

  显示原文与译文双语对照的内容
0 0

我正在尝试实现如下的路由:

posts/535434/This-is-a-post-title

posts/tagged/tags+here
//Matches {controller}/{action}/{id} - Default
//Displays all posts with the specified tags
//uses PostsController : ActionTagged(string tags)
posts?pageSize=50&pageIndex=4
//Matches {controller}/{action}/{id} - Default
//Displays all posts
//uses PostsController : Index(int? pageSize, int? pageIndex)

以下是我要执行的操作:

posts/39423/this-is-a-post-title-here
//Typically this is implemented using an action like 'Details'
//and would normally look like : posts/details/5

我似乎无法使路由正常工作。 我尝试了这样的方法:

{controller}/{id}/{description}

将默认操作设置为"显示",但是不允许我导航到它的他命名操作,如"加标签"。

我犯了什么错?

谢谢!

时间:原作者:3个回答

0 0

有两个问题:

首先,你应该始终按照降低的特殊性来排列路由( 比如 。 最具体的情况是最后一个,最后一个例子,这样路线将"fall",如果不匹配,它将尝试。

所以在定义 {controller}/{action}/... 之前我们要定义 {controller}/{postid}/... ( 必须是 postid ) ( 可能是其他任何东西)

接下来,我们希望能够指定如果postid的值看起来不像 Post,那么路由就会失败。 我们可以通过创建一个IRouteConstraint类来实现:

public class PostIDConstraint : IRouteConstraint
{ 
 public bool Match(HttpContextBase httpContext,
 Route route,
 string parameterName, 
 RouteValueDictionary values, 
 RouteDirection routeDirection)
 {
//if input looks like a post id, return true.
//otherwise, false
 }
}

我们可以将它添加到路由定义中,如下所示:

routes.MapRoute(
"Default",
"{controller}/{postid}/{description}",
 new { controller ="Posts", action ="Display", id = 0 },
 new { postid = new PostIDConstraint() }
);
原作者:
0 0

我不是 100%我理解你的问题但听起来你可以以定义一些不同的路线。

routes.MapRoute("PostId","posts/{id}/{title}",
 new { Controller ="Posts", Action ="DisplayPost", id = 0, title ="" },
 new { id = @"d+" });
routes.MapRoute("TaggedPosts","posts/tagged/{tags}",
 new { Controller ="Posts", Action ="DisplayTagged", tags ="" });
routes.MapRoute("Default","posts",
 new { Controller ="Posts", Action ="Index" });

你可以以使用 正规表达式 验证参数,如我在第一次路由中使用的参数,或者者如果有更好的验证。 在路由中不需要包含 QueryString 参数;只要参数名称匹配,它们就会被传递到索引方法。

原作者:
...