1

我通过路由设置了模式用户/{域}/{用户名}。一切正常,除了一件事。我不知道如何将域和用户名变量传递给我的重定向页面。下面是我的 IRouteHandler 实现中的 GetHttpHandler 方法。

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string basePath;
        basePath = "~/UserPage.aspx";
        string domain = requestContext.RouteData.GetRequiredString("domain");
        string username = requestContext.RouteData.GetRequiredString("username");

        string virtualPath =
            string.Format(basePath + "?domain={0}&username={1}", domain, username);
        return (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page));

    }

我从最后一行代码中得到错误:UserPage.aspx?domain=SOMEDOMAIN&username=SOMEUSER 不是有效的虚拟路径。

那么你应该如何将变量传递给目标页面呢?我错过了什么?

4

4 回答 4

1

似乎其他人也在采取将参数放入上下文 Items 集合的路线(没有双关语)。

http://bbits.co.uk/blog/archive/2008/05/19/using-asp.net-routing-independent-of-mvc---passing-parameters-to.aspx

我为具有特定参数的页面结合了其中的几种方法,我为接受该类型参数的页面创建了一个 UserNameRouteHandler。在我的 PageBase 类中,我检查了该参数的上下文项,然后设置了一个属性,以便从 PageBase 继承的页面可以使用它。

public class UserNameRouteHandler : IRouteHandler
{
    #region Implementation of IRouteHandler

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string pageName = requestContext.RouteData.GetRequiredString("PageName");

        string employeeUserName = requestContext.RouteData.GetRequiredString("UserName");

        if(!string.IsNullOrEmpty(employeeUserName))
        {
            requestContext.HttpContext.Items["UserName"] = employeeUserName;
        }

        pageName = pageName.ToLower() == "home" ? "default" : pageName;

        string virtualPath = string.Format("~/{0}.aspx", pageName);

        return (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page));

    }

    #endregion
}

在我的 PageBase 的 OnLoad 中,我将属性设置为需要它的页面可以拥有它......不过肯定是在寻找更优雅的解决方案。

protected override void OnLoad(EventArgs e)
{
    if (!IsPostBack)
    {
        if (Context.Items["UserName"] != null)
        {
            EmployeeUserName = Context.Items["UserName"].ToString();
        }
    }

    base.OnLoad(e);
}
于 2010-09-23T13:35:22.837 回答
1

我想我自己解决了这个问题。找到这个循环

  foreach (KeyValuePair<string, object> token in requestContext.RouteData.Values)  
     {                  
         requestContext.HttpContext.Items.Add(token.Key, token.Value);  
     }  

来自http://www.codethinked.com/post/2008/08/20/Exploring-SystemWebRouting.aspx 它就像第 4 个代码示例。

更新:
不确定这是否可行...... requestContext.HttpContext 似乎是“只读的”。回到绘图板。

更新 2:
如果您添加对 System.Web.Abstractions 的引用,看起来这将起作用

于 2009-02-03T22:46:15.783 回答
1

开始乱搞,看到 IHttpHandler 接口为 GetHttpHandler 方法提供了 RequestContext。

所以,我修改了我的基页面类(我总是在 System.Web.UI.Page 和我自己的页面之间放置一个层,为此目的将其称为 BasePage 或类似名称)。所以我在 PVBasePage 上添加了一个公共属性来接收一个 RequestContext 对象。

public RequestContext RequestContext { get; set; }

然后,我的路由类代码如下:

IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
{
    // create the page object as my own page...
    var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath
        , typeof(PVBasePage)) as PVBasePage;
    // pass in the request context
    page.RequestContext = requestContext;
    // return this page in the form of a IHttpHandler
    return page as IHttpHandler;
}

因此,我没有像示例代码中那样直接将实例创建为 IHttpHandler,而是将其创建为我自己的页面。设置请求上下文属性,然后将页面作为 IHttpHandler 返回给调用者。

经过测试,它可以工作。呜呼!

然后在实例页面中,您可以点击 RequestContext.GetValues 集合来读出您传入的参数。

高温高压

于 2009-03-17T03:40:56.727 回答
1

@B.廷德尔

我刚刚使用与您类似的解决方案来解决这个问题。

位于: http: //msmvps.com/blogs/luisabreu/archive/2008/03/12/using-the-routing-mvc-api-with-classic-asp-net.aspx

foreach (var aux in requestContext.RouteData.Values)
{
    HttpContext.Current.Items[aux.Key] = aux.Value;
}

所以实际上你不再使用 Request.QueryString 而是 Context.Items 集合

HttpContext.Current.Items["RouteName"]

或者

Context.Items["RouteName"]
于 2009-12-02T08:26:49.187 回答