我正在开发一个房地产网站并使用URL路由,因此我的客户可以让他们的特色属性在URL中显示他们的地址:www.realestatewebsite.com/featured/123-Fake-St
但是,我是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;
}
答案 0 :(得分:2)
你正以典型的方式接近这一点。 Scott Gu's URL Routing with ASP.NET 4显示您使用的完全相同的模式。
如果您正在寻找建议:
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.
}
答案 1 :(得分:0)
你看过ASP.NET MVC Routing Overview (C#)了吗?这是我建议在哪里看的虽然ASP.NET MVC Framework (Part 2): URL Routing也有一些提示可能值得在某种程度上检查,因为你在某种意义上几乎有一些RESTful。在尝试使用Web表单解决方案之前,至少这是我要考虑的。
答案 2 :(得分:0)
你的直觉是正确的,当Page.RouteData.Values [“address”]未定义时抛出是不好的做法 - 特别是因为它不存在是完全合理的。
在对对象进行方法调用之前测试null始终是一种好习惯。您可能还会考虑合并运算符?? (见http://msdn.microsoft.com/en-us/library/ms173224.aspx),虽然有些人认为它很丑陋和/或难以阅读。