c# - asp.net 网络表单路由无法正常工作

标签 c# asp.net url-rewriting webforms url-routing

假设我的分层 urlsfriendly urls 如下所示,并且某些页面由于不同的设计或与之关联的表单而具有不同的页面处理程序

www.abc.com/personal
www.abc.com/personal/acounts-deposits
www.abc.com/personal/acounts-deposits/current-account
www.abc.com/personal/acounts-deposits/current-gold-account
www.abc.com/personal/acounts-deposits/easy-saver-ac
www.abc.com/personal/acounts-deposits/fixed-account
www.abc.com/loans
www.abc.com/loans/personal-loans
www.abc.com/loans/car-loans

我的数据库结构和示例数据如下所示

Page_ID     Page_Name               Page_url                                    Page_Handler        Parent_Page_ID
1           Home                    home                                        index.aspx              0               
2           Personal                personal                                    Personal.aspx           0               
3           Accounts & Deposits     personal/acounts-deposit                    Personal.aspx           2               
4           Current Account         personal/acounts-deposit/current-account    Personal.aspx           3               
5           Current Gold Accounts   personal/acounts-deposit/gold-account       gold-account.aspx       3               
6           Easy Saver              personal/acounts-deposit/easy-saaver-ac     Personal.aspx           3               
7           Fixed Deposits          personal/acounts-deposit/fixed-account      fixed-account.aspx      3               
8           Loans                   loans                                       loans.aspx              0               
9           Personal Loans          loans/personal-loans                        loans.aspx              8               
10          car Loans               car-loans                                   car-loan.aspx           8     

在我的 Menu_Table 中,我可以通过 Page_url 识别页面,因为它是唯一的。

    routes.MapPageRoute("Personal_Route", "en/{*path}", "~/en/personal.aspx", false,
        new RouteValueDictionary {
                    { "path", "Page-not-found" },{ "PageName", "Page-not-found" }
                });


    routes.MapPageRoute("Personal_Route2", "en/{*path}", "~/en/gold-account.aspx", false,
        new RouteValueDictionary {
                    { "path", "Page-not-found" },{ "PageName", "Page-not-found" }
                });

    routes.MapPageRoute("Personal_Route2", "en/{*path}", "~/en/fixed-account.aspx", false,
        new RouteValueDictionary {
                    { "path", "Page-not-found" },{ "PageName", "Page-not-found" }
                });

上面的路由代码默认总是使用第一个路由 personal.aspx 作为所有 url 的处理程序

我已经尝试了很长一段时间,但我无法做到正确,我将不胜感激这方面的帮助,以便每个页面都由基于 Page_url 的正确页面处理程序处理。 p>

我希望页面由页面处理程序处理,如下所示

www.abc.com/personal  ----  (Personal.aspx)
www.abc.com/personal/acounts-deposits -----(Personal.aspx)
www.abc.com/personal/acounts-deposits/current-account -----(Personal.aspx)
www.abc.com/personal/acounts-deposits/current-gold-account ----- (gold-account.aspx)
www.abc.com/personal/acounts-deposits/easy-saver-ac -----(Personal.aspx)
www.abc.com/personal/acounts-deposits/fixed-account ----- (fixed-account.aspx(
www.abc.com/loans ----- (loans.aspx) 
www.abc.com/loans/personal-loans ----- (loans.aspx)
www.abc.com/loans/car-loans ----- (car-loan.aspx)

最佳答案

我不确定你的方法是否正确。让我解释一下:

在你的情况下,你用相同的配置映射你的路由

  routes.MapPageRoute("Personal_Route", "en/{*path}"
  routes.MapPageRoute("Personal_Route2", "en/{*path}"

等等。

这些路由中的每一个都将与您的应用程序的所有请求完全匹配

为了实现您的目标,最好以这种方式映射:

 //Take care to the sequensce of routes becuase if you will use route 
 //"personal" before route "account" and you will receive a request to
 //"http://domain.com/personal/somethinghere route account will match 
 //"en/personl/ and will proceed to redirect to "personal" destination 
 routes.MapPageRoute("account", "en/personal/{q}/" ...........
 routes.MapPageRoute("personal", "en/personal" ............


 //Same as above 
 routes.MapPageRoute("loancar", "en/loan/{q}" .........
 routes.MapPageRoute("loan", "en/loan"

现在,当您正确创建并选择了路线后,您可以通过简单的方式访问您的参数,并为特定情况选择正确的操作,例如:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.RouteData.Values.ContainsKey("q"))
        {
            if (Page.RouteData.Values["q"] !=null)
            {
                string p = (string)Page.RouteData.Values["q"];
                switch (p)
                {
                    case "a":
                        //do something
                    case "b":
                    //do something
                    case "c":
                        // Do Something
                        break;
                    case "d":
                        // Do Something
                        break;
                    default:
                        // Do Something
                        break;
                }
            }
        }
    }

现在你必须对你的数据库做一些小改动,你将只用你的 url 的最后一页填充它。

注意如何映射它非常重要......我已经向您展示了一个简单的示例,其中只有“静态路由”(个人)和动态路由,只有一个名为路径的参数。有很多方法可以更好地实现您的目标,具体取决于您的需求。希望对您有所帮助。

更新: 您不必创建所有路由,您只需要创建所需的顶级路由,然后您需要为每个部分创建或新页面,或者使用 multiwiex Controller 将页面拆分为多个部分,注意显示正确的内容例如,对于客户,如果您有个人页面将用于显示页面的 2/3/4 部分,您可以使用依赖于 {q} 参数的多 View 控件,然后使用如下所示的开关盒:

 switch (p)
                {
                    case "a":
                        //do something
                        multiview.ActiveViewIndex=0
                    case "b":
                    //do something
                        multiview.ActiveViewIndex=1
                    case "c":
                        // Do Something
                         multiview.ActiveViewIndex=2
                        break;
                    case "d":
                        // Do Something
                          multiview.ActiveViewIndex=3
                        break;
                    default:
                         multiview.ActiveViewIndex=4
                        break;
                }

这是简单的方法。

在这种情况下,在示例路由“PersonalRoute”中公开模式 personal/acounts-deposit 可以用于这种特殊情况,如果您需要重定向到特殊情况。现在的问题是我不知道你的业务逻辑如何,我也不知道你的 dal 配置,所以我无法让你找到一个准确的方法来弄清楚。

我不知道将在您的页面中执行或运行多少任务,因此我无法为您提供更多相关信息。

创建一条独特的路线不是一个好的方法或想法。

关于c# - asp.net 网络表单路由无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22658742/

相关文章:

c# - 如何使用 Selenium 或其他工具操作 Chrome 扩展的小部件?

c# - WPF 数据网格选定项

c# - 一个项目中的 key 无效错误但在同一解决方案的不同项目中有效

php - 重写 URL 中的单词 - wordpress

c# - 从条形码检索产品信息

ASP.NET WebMethod 返回用引号括起来的 JSON

c# - 需要修改参数的参数化查询mySQL

c# - Session 和 Cookie 有什么区别?

javascript - 如何在Framework7中重写URL?

php - 站点全局htaccess重写规则