1

ルーティングを介して User/{domain}/{username} というパターンを設定しました。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

これは自分で解決したと思います。このループが見つかりました

  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

他の人も、コンテキスト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

@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 に答える
1

いろいろいじり始めたところ、IHttpHandler インターフェイスが RequestContext を GetHttpHandler メソッドに提供していることがわかりました。

そこで、基本ページ クラスを変更しました (私は常に 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 AS として呼び出し元に返します。

テスト済みで動作します。ウーホー!

次に、インスタンス ページで、RequestContext.GetValues コレクションをヒットして、渡されたパラメーターを読み取ることができます。

HTH

于 2009-03-17T03:40:56.727 に答える