.aspx中的URL路由

本文关键字:路由 URL 中的 aspx | 更新日期: 2023-09-27 18:05:33

我在一个房地产网站工作,并使用URL路由,所以我的客户可以有他们的特色属性显示他们的地址在URL: www.realestatewebsite.com/featured/123-Fake-St

然而,我是新的URL路由,我认为我采取了一个可怜的捷径。我本来想使用我的数据库的主键来访问属性(propID),但不想把它传递到URL,所以使用地址来获取propID并从那里使用它。然而,如果我尝试分配Page.RouteData。值["address"]为字符串,且URL中没有地址,则抛出异常。因此我有一个try/catch语句来处理它。但对我来说,这似乎是一种糟糕的做法。如果有人能告诉我这样做是否可以接受,或者是否有更好的解决方案,请告诉我。

Here's the Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("", "Featured/{address}", "~/Featured/Default.aspx");
}

这里有一个方法来自www.website/com/Featured/Default.aspx:

protected int getPropID()
{
    string address;
    int propID = -1; //If the method returns -1 the page just lists all featured properties
    try
    {
        address = Page.RouteData.Values["address"].ToString();
    }
    catch (Exception ex)
    {
        return propID;
    }
    if (address != null)
    {
        string strSQL = "SELECT propID FROM tblFeatured WHERE address = '" + address + "'";
        DataTable dt = da.FillDataTable(strSQL);
        if (dt.Rows.Count > 0)
            propID = Convert.ToInt32(dt.Rows[0]["propID"]);
        return propID;
    }
    else
        return propID;
}

.aspx中的URL路由

您正在以典型的方式处理这个问题。Scott Gu的URL路由与ASP。. NET 4显示了与您使用的完全相同的模式。

  • 设置路由
  • 确保令牌在URL的某处
  • 在加载目标.aspx页面时,获取令牌,查询db.
  • 根据需要显示标记

如果你正在寻找建议:

  • 每个属性都应该在数据库中预先提取一个'slug'或令牌。只是要查询的另一个属性,而不是数字标识符。DataTable没有太大帮助。
  • 保留您的令牌作为街道地址(如果您的客户不介意,可能包括城市搜索引擎优化果汁)
  • 使用该令牌在数据库中查找房屋/物业记录。在这一点上忘记数字id。选择与令牌匹配的属性,并将其写入页面。性能差为零。
string propertyToken =  Page.RouteData.Values["address"].ToString();
Property p = PropertyDatabase.GetSingleByToken(propertyToken);
if(p!=null)
{
    WritePropertyToPage(p);
}
else
{
    //write to page that token wasn't found/misspelled/expired/etc.
}

你看过ASP吗?. NET MVC路由概述(c#)?这就是我对ASP的建议。. NET MVC框架(第2部分):URL路由也有一些技巧,在某种程度上可能值得研究,因为在某种意义上您几乎有了RESTful的东西。至少这是我在尝试web表单解决方案之前会考虑的。

你的直觉是正确的,抛出当Page.RouteData。Values["address"] is undefined是一种糟糕的做法——尤其是当它完全有理由不存在的时候。

在尝试调用对象的方法之前测试null始终是一个很好的做法。您还可以考虑合并操作符??(参见http://msdn.microsoft.com/en-us/library/ms173224.aspx),尽管有些人认为它很丑,而且/或者很难阅读。