我试图找到一种在声明性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;]
我有两个具体问题。
如何将路由值传递给我的GetMyRoute方法?允许我使用此GetMyRoute(&#34;&lt;%$ RouteValue:MyRoute%&gt;)的语法是什么。
我有什么方法可以使用RouteData对象读取值吗?同样,它返回null,但值在Page_Load中。
我如何传递变量&#34;&lt;%$ RouteUrl:param = myparan,param2 = 0%&gt;&#34;对于其中一个参数,请说一下页面上的属性?
**部分解决方案 *
我找到了以下代码。但是,如何将页面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;%=语法以查看是否修复了它。到目前为止提出的解决方案并未解决核心问题。
答案 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课程中进行一次更改,它将适用于整个网络表格。
使用上面的代码,如果您在导航到不同路径时遇到任何问题,请告诉我。