我正在网络表单中实现路由:
这是我的自定义路线
public static void MyCustomRoutes(RouteCollection routes)
{
routes.Ignore("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("NewsByTitle",
"{NewsTitle}",
"~/News.aspx");
routes.MapPageRoute("BlogsByTitle",
"{BlogsTitle}",
"~/ViewBlogs.aspx");
}
在我的默认页面中,我有博客和新闻部分,当我点击News
时,它会导航到新闻页面,因为它首先在路由表中定义。
但是当我点击Blogs
时,它只采用新闻路线。
以下是RedirectToRoute
和Blogs
News
新闻:
String Url = clsMethods.GetTileByStoryId(BlogId); //My Url Param
Response.RedirectToRoute("NewsByTitle", new { NewsTitle = Url });
博客
String Url = clsMethods.GetTileByStoryId(BlogId);
Response.RedirectToRoute("BlogsByTitle", new { BlogsTitle = Url});
更新
根据Mihir Suggestion,我创建了Custom Constraint以便解决我的需求,这就是我实现Constraint Logic的方法
public static void MyCustomRoutes(RouteCollection routes)
{
routes.Ignore("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("NewsByTitle",
"{NewsTitle}",
"~/News.aspx",
false,
null,
new RouteValueDictionary
{ { "checkNewsRoute", new IsNewsConstraint() } });
routes.MapPageRoute("BlogsByTitle",
"{BlogsTitle}",
"~/ViewBlogs.aspx",
false,
null,
new RouteValueDictionary
{ { "checkRoute", new IsBlogConstraint()} });
}
这是约束
博客约束
public class IsBlogConstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
return clsMethods.checkRoute(Convert.ToString(values["BlogsTitle"]));
}
}
新闻约束
public class IsNewsConstraint : IRouteConstraint
{
public bool Match
(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
return clsMethods.checkNewsRoute(Convert.ToString(values["NewsTitle"]));
}
}
答案 0 :(得分:1)
我认为您正在尝试配置路由以映射以下网址格式。
根据您的配置,如果您尝试打开博客,它会将您带到新闻页面,这是正确的行为,因为博客的URL确实与新闻路线匹配。
要区分两个不同的页面,您需要为新闻和博客两种类型的路径配置路径,就像我在下面所做的那样。
routes.MapPageRoute("NewsByTitle", "news/{NewsTitle}", "~/News.aspx");
routes.MapPageRoute("BlogsByTitle", "blogs/{BlogsTitle}", "~/ViewBlogs.aspx");
如果您正在寻找您在问题中提到的解决方案,则需要实施路径约束,因为它已完成here。 Custom Constraints帮助路由阻止路由匹配,除非您的案例中匹配某些自定义条件,博客或新闻。
在该约束中,您可以编写一些逻辑来检查路径段是新闻还是博客并返回布尔值。因此,当新闻约束查找博客名称时,它不会将该条目作为新闻(在数据库中)找到并返回false,并且该路由将被忽略。