解析RouteValue Parms ASPX

时间:2014-06-06 15:08:34

标签: asp.net .net routing asp.net-mvc-routing

我试图找到一种在声明性ASPX部分中为ASP.NET Web窗体生成路由的方法。

此示例有效,但它没有以/ name / value /的形式正确格式化路由,而是/ name / value?param2 = 0.

   <asp:HyperLink ID="EventLink" NavigateUrl="<%$RouteUrl:param=myparan, param2=0 %>" Text="More" runat="server" />

我创建了第二种方法,如下所示,我想我可以提取路由值

<a href="<%# GetMyRoute(Page) %>") %>">

GetMyRoute尝试提取路由值,但RouteData始终为空:

page.RouteData.Values [&#34; MyParam&#34;]

我有两个具体问题。

  1. 如何将路由值传递给我的GetMyRoute方法?允许我使用此GetMyRoute(&#34;&lt;%$ RouteValue:MyRoute%&gt;)的语法是什么。

  2. 我有什么方法可以使用RouteData对象读取值吗?同样,它返回null,但值在Page_Load中。

  3. 我如何传递变量&#34;&lt;%$ RouteUrl:param = myparan,param2 = 0%&gt;&#34;对于其中一个参数,请说一下页面上的属性?

  4. **部分解决方案 *

    我找到了以下代码。但是,如何将页面RouteValue作为参数传递?

    <asp:HyperLink ID="HyperLinkClient" runat="server"  
        NavigateUrl='<%# GetRouteUrl("ClientRoute", new {ClientID = Eval("ClientID")}) %>' > 
        Go to Client details 
    </asp:HyperLink>
    

    以下操作无效,因为RouteData为空。

       <asp:HyperLink ID="HyperLinkClient" runat="server"  
            NavigateUrl='<%# GetRouteUrl("ClientRoute", new {ClientID = RouteData.Values["ClientId"] }) %>' > 
            Go to Client details 
        </asp:HyperLink>
    

    更新 中央&#34;症结&#34;这个问题是如何传递传递给页面的路由参数,而不会产生代码隐藏解决方案。请注意,在上面显示的配置中选中时,RouteData.Values为空/空。我需要测试&lt;%=语法以查看是否修复了它。到目前为止提出的解决方案并未解决核心问题。

2 个答案:

答案 0 :(得分:0)

当RouteConfig.cs包含以下路线时

public static void RegisterCustomRoutes(RouteCollection routes)
{
    routes.MapPageRoute("Route1", "{name}/{value}", "~/default.aspx");
}

然后您可以使用routename作为

来引用它
<%$RouteUrl:routename=Route1,name=MyParam,value=0%>

它将呈现

<a id="HyperLink1" href="/MyParam/0">...

示例:将以下代码复制到default.aspx

<%@ Page Language="C#"  %>

Name=<%=RouteData.Values["name"] %>
Value=<%=RouteData.Values["value"] %>

<asp:HyperLink ID="HyperLink1" runat="server" 
NavigateUrl="<%$RouteUrl:routename=Route1,name=MyParam,value=0%>">
More</asp:HyperLink>

并致电http://localhost/MyParam/0 - 输出

Name=MyParam 
Value=0

更新:

要从您可以使用的代码中格式化网址

protected string GetMyRoute()
{
    return "/" + Page.RouteData.Values["name"] + "/" + Page.RouteData.Values["value"];
}

<a href="<%=GetMyRoute()%>">Link</a>

更新2:

对于定义为

的路线
routes.MapPageRoute("ClientRoute", "{ClientID}", "~/default.aspx");

您可以将网址称为http://localhost/something并使用以下aspx布局

<%@ Page Title="Home Page" Language="C#" Inherits="WebApplication1._Default"  %>
<a href="<%=GetRouteUrl("ClientRoute", new { ClientID = RouteData.Values["ClientID"] })%>">Link</a>

和代码隐藏

protected string GetRouteUrl(string routeName, RouteValueDictionary parameters)
{
    VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, parameters);
    return vpd == null ? "/" : vpd.ToString();
}

答案 1 :(得分:0)

这是一个干净的ASP.NET网络表单路由解决方案,我目前正在我的网络表单项目中使用这种技术。

首先:使用静态类为整个应用程序域创建所有URL。 (这是带有和不带URL参数的此类的示例)

public static class UrlMaker
{

    // example authentication urls
    public static string ToLogin() { return Path("~/login"); }
    public static string ToLogout() { return Path("~/logout"); }

    // example of a url with parameteres
    public static string ToCourse(int courseCode, string courseName) 
    { return Path("~/courses/{0}/{1}", courseCode, courseName); }

    //add more urls here ...


    //private url builder helper
    static string Path(string virtualPath){
        return VirtualPathUtility.ToAbsolute(virtualPath);
    }

    //overloaded private url builder helper
    static string Path(string virtualPath, params object[] args) {
        return Path(string.Format(virtualPath, args));
    }

}

第二次:App_Start文件夹中的RouteConfig类将保持与以前相同,在我的情况下就像下面的代码:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes) 
    {
        routes.Ignore("{resource}.axd/{*pathInfo}");

        routes.MapPageRoute("Login", "login", "~/Login.aspx");
        routes.MapPageRoute("Logout", "logout", "~/Logout.aspx");
        routes.MapPageRoute("Course", "courses/{coursecode}/{coursename}",
                                          "~/Home/CoursePortal.aspx");
    }
}

现在,您可以在应用程序的任何位置使用上面声明的URL,如下所示:

您的.aspx文件

<a href='<%: UrlMaker.ToLogout() %>'>Sign Out</a>
<a href='<%: UrlMaker.ToLogin() %>'>Sign In</a>

<a href='<%: UrlMaker.ToCourse(1234, "course name") %>'>Stackoverflow Tutorial</a>

您还可以从动态数据字段传递动态参数,如下所示:

<a href='<%: UrlMaker.ToCourse(Eval("id"), Eval("name")) %>'>Stackoverflow Tutorial</a>

上述课程的优势在于,无论您在不同的网络表单中调用网址多少次,如果您的网址发生任何更改,那么您只需要在UrlMaker课程中进行一次更改,它将适用于整个网络表格。

使用上面的代码,如果您在导航到不同路径时遇到任何问题,请告诉我。