我正在尝试.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];
}

08-25 15:51