我正在尝试.NET 4.0的新功能-URL路由,但无法获取在URL中传递的信息。以下是代码:
GLOBAL.ASPX.CS
protected void Application_Start(object sender, EventArgs e)
{
SetRouting(RouteTable.Routes);
}
private void SetRouting(RouteCollection routeCollection)
{
routeCollection.MapPageRoute("Company",
"Company/{CompanyName}",
"~/Asset/RequestForm.aspx", true, new RouteValueDictionary { { "CompanyName", "?CompanyName" } });
routeCollection.MapPageRoute("Deal",
"Company/{CompanyName}/{DealName}",
"~/Asset/RequestForm.aspx", true, new RouteValueDictionary { { "DealName", "?DealName" } });
routeCollection.MapPageRoute("ClientRoute",
"Client/{ClientCompanyName}",
"~/User/Login.aspx", true, new RouteValueDictionary { { "ClientCompanyName", "?ClientCompanyName" } });
}
Login.aspx:
private string CompanyName {
get
{
if (Page.RouteData.Values["ClientCompanyName"] == null)
{
return null;
}
return Page.RouteData.Values["ClientCompanyName"].ToString();
}
}
现在,即使我在网址中使用Client / Google,上述属性也会返回null。当我重新设置IIS(IIS 6)并首次执行此操作时,它将返回值。否则,它为null。
任何线索??
最佳答案
routeCollection.MapPageRoute("ClientRoute",
"Client/{ClientCompanyName}",
"~/User/Login.aspx",
true,
new RouteValueDictionary {{ "ClientCompanyName", "?ClientCompanyName"}};
这实际上没有多大意义。如果未提供URL中的“ ClientCompanyName”值,则RouteValueDictionary用于指示要使用的默认值。在这里,您是说希望“?ClientCompanyName”为默认值。因此,例如,如果导航到http://baseUrl/Client,则默认为http://baseUrl/Client/?ClientCompanyName(字面意思)。我认为您实际上想将?ClientCompanyName更改为希望作为默认名称的实际“真实”公司名称。我的建议是在这种情况下不使用默认值,而仅使用具有3个参数(字符串,字符串,字符串)的MapPageRoute覆盖。我发现在很多情况下,这就足够了。此外,这是您可以为Request对象提供的扩展方法,可以帮助您:
public static string GetDataFromRouteOrRequest(this HttpRequest request, string key)
{
if (request.RequestContext.RouteData.Values.ContainsKey(key))
return request.RequestContext.RouteData.Values[key].ToString();
return request[key];
}