2011-08-15 66 views
2

我正在處理房地產網站並使用URL路由,因此我的客戶可以在URL中顯示其地址:www.realestatewebsite.com/featured/123-Fake-St.aspx中的URL路由

不過,我是新來的URL路由,我想我採取了一個可憐的捷徑。我本來希望使用我的數據庫的主鍵來訪問屬性(propID),但不想將它傳遞到URL中,所以改爲使用地址來獲取propID並從那裏使用它。但是,如果我嘗試將Page.RouteData.Values [「address」]分配給一個字符串,並且URL中沒有地址,則會引發異常。因此,我有一個try/catch語句來處理它。儘管這對我來說似乎很差。如果有人能告訴我這是否可以接受,或者如果有更好的解決方案,請告訴我。

這裏是在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; 
} 
+5

哇,當這段代碼在生產中時,大聲喊我們,所以我們可以玩SQL注入!要嚴肅認真,你不應該將WebForm/QueryString的值直接傳遞到查詢中,請使用SqlParameter()向查詢添加一個參數+特殊符號的自我驗證 – sll

+0

正確的,我剛纔做了這個改變,但我真正的問題是如果使用try/catch語句是可以接受的,或者如果我應該對URL路由使用不同的策略。 –

回答

2

你正在以典型的方式接近這一點。 Scott Gu's URL Routing with ASP.NET 4顯示您正在使用的完全相同的模式。

  • 設置路線
  • 確保令牌是你的目標的頁面加載.aspx頁面中,搶令牌,查詢數據庫的URL某處
  • 根據需要該令牌

顯示您的標記如果你正在尋找的建議:

  • 每個屬性應該有一個「塞」或令牌在數據庫中預提取。只是另一個要查詢的屬性,而不是數字標識符。 DataTable沒有太多幫助。
  • 保留您的令牌作爲街道地址(如果您的客戶不介意,也許包括SEO汁的城市)
  • 使用該令牌去查找數據庫中的房屋/財產記錄。忘記數字ID在這一點上。選擇令牌匹配的屬性,並將其寫入頁面。 Perf差異爲零。
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. 
} 
+0

感謝您的迴應! –

0

你有沒有看着ASP.NET MVC Routing Overview (C#) ?這是我在哪裏可以看到的建議,儘管ASP.NET MVC Framework (Part 2): URL Routing也有一些提示可能值得在某種程度上進行檢查,因爲您在某種意義上幾乎有一些RESTful。至少這是我在嘗試Web表單解決方案之前所考慮的。

+0

我知道MVC會是一個更好的方式,但不幸的是我工作的人都被困在網絡表單上。所以我必須找出一個沒有MVC的解決方案。 –

0

你的直覺是正確的,扔在Page.RouteData.Values [「地址」]未定義的不良做法 - 尤其是因爲它是完全合理的,它不存在。

在嘗試對對象進行方法調用之前,測試null值總是一個好習慣。你也可以考慮coalesing操作符? (見http://msdn.microsoft.com/en-us/library/ms173224.aspx),儘管有些人認爲它很難讀和/或難以閱讀。