基于相同参数模式和Web表单中不同页面的路由

时间:2016-10-29 09:57:06

标签: c# asp.net webforms routing

我正在网络表单中实现路由:

这是我的自定义路线

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时,它只采用新闻路线。

以下是RedirectToRouteBlogs

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"]));
        }
    }

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试配置路由以映射以下网址格式。

  1. 新闻:http: //www.website.com/title-of-the-news
  2. 博客:http: //www.website.com/title-of-the-blog
  3. 根据您的配置,如果您尝试打开博客,它会将您带到新闻页面,这是正确的行为,因为博客的URL确实与新闻路线匹配。

    要区分两个不同的页面,您需要为新闻和博客两种类型的路径配置路径,就像我在下面所做的那样。

    routes.MapPageRoute("NewsByTitle", "news/{NewsTitle}", "~/News.aspx");
    routes.MapPageRoute("BlogsByTitle", "blogs/{BlogsTitle}", "~/ViewBlogs.aspx");
    
    1. 新闻:http://www.website.com/news/title-of-the-news
    2. 博客:http://www.website.com/blogs/title-of-the-blog
    3. 如果您正在寻找您在问题中提到的解决方案,则需要实施路径约束,因为它已完成hereCustom Constraints帮助路由阻止路由匹配,除非您的案例中匹配某些自定义条件,博客或新闻。

      在该约束中,您可以编写一些逻辑来检查路径段是新闻还是博客并返回布尔值。因此,当新闻约束查找博客名称时,它不会将该条目作为新闻(在数据库中)找到并返回false,并且该路由将被忽略。