【问题标题】:ASP.NET ReturnURL to specific search results pageASP.NET ReturnURL 到特定的搜索结果页面
【发布时间】:2020-03-31 01:04:14
【问题描述】:

我有一个带有 C# 后端代码的 ASP.net 站点。我们有以下(删节的)代码,它适合我们的需要,但它可能会更好。这是在名为 SearchResults.aspx 的页面上。如果用户未登录,链接会将他们重定向到登录页面。如果他们已登录,它会将他们重定向到该项目的查找页面。我想要做的是,如果他们点击“未登录链接”,他们登录后将他们重定向到相应的项目页面。我需要以什么方式将 returnURL 提供给登录页面?我尝试过的每一种方式,它只是在登录后将我重定向到默认页面。

<AnonymousTemplate>
    <!--Want to change the link below so that the return URL will take me to 
    ItemInformation.aspx-->
     <%# DataBinder.Eval(Container.DataItem, "itemnumber").ToString().Trim() %><br/>
     <asp:HyperLink runat="server" ID="HyperLink1" NavigateUrl='Account/Login.aspx'>
     Please login to review information for this item.</asp:HyperLink>
</AnonymousTemplate>
<LoggedInTemplate>
    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%#
       "~/ItemInformation.aspx?&ItemID=" + DataBinder.Eval(Container.DataItem,
       "itemnumber").ToString().Trim() + "&itemdept=" + DataBinder.Eval(
       Container.DataItem, "department").ToString()%>'
       Text='<%# DataBinder.Eval(Container.DataItem, "itemnumber")%>'>
    </asp:HyperLink>
</LoggedInTemplate>

编辑 - 我正在使用 ASP.net Web 应用程序模板的默认登录结构,所以这就是登录后端的全部内容。

    protected void Page_Load(object sender, EventArgs e)
    {
        string returnUrl = Request.QueryString["ReturnUrl"];
        RegisterHyperLink.NavigateUrl = "Register.aspx?ReturnUrl=" +
          HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
    }

【问题讨论】:

  • 为我们提供实际登录发生的代码,即 - Login.aspx 的后端代码
  • 我已经包含了它,但是我使用了包含登录页面的 ASP.net 模板。后端就是上面的加载函数。
  • 检查你提供的前 3 行函数,你认为它的表现如何?
  • 抱歉,默认重定向是在测试其他内容之后添加的。以我执行redirectURL 的方式,它仍然会在没有该代码的情况下恢复为默认值。但是,我认为我没有正确执行 returnURL,因为如果查询字符串有问题,ItemInformation 会重定向到默认值。
  • 尝试以下操作:1. 注销 2. 进入搜索页面 3. 你被重定向到登录,这个页面的 url 是什么?

标签: c# asp.net login


【解决方案1】:

开启SearchResults.aspx

if (!Request.IsAuthenticated)
{
    Response.Redirect("/Login.aspx/?ReturnURL="+HttpContext.Current.Request.Url.AbsoluteUri); // dont forget to use urlencode
}

开启Login.aspx

protected void Login_Click()
{
    if (Request.QueryString["ReturnURL"] != null)
    {
        Response.Redirect(Request.QueryString["ReturnURL"]);
    }
    else
    {
        Response.Redirect("/Home.aspx");
    }

}

【讨论】:

  • 好吧,就像一个假人,我什至没有想过使用完整路径而不是相对路径,所以这看起来更有希望。但是,当我添加 Login_Click 事件处理程序时,它会导致它无法登录。不这样做仍然会重定向到主页。登录页面正在使用验证组和 asp: 登录控件,但我没有看到成功登录页面的设置位置。
  • 我个人不使用登录控件。 Login_Click() 是我为便于阅读而命名的占位符方法。查看 Login 控件,LoggedIn 事件在用户通过身份验证后引发,因此您可以将重定向逻辑放在该方法中。
  • 知道了。需要该事件...在我最初的尝试之一中,我试图仅依赖 DestinationPageUrl 属性,该属性适用于其他页面,但不适用于具有附加查询字符串属性的页面。发布解决方案。感谢您的帮助。
【解决方案2】:

在我尝试让它工作的一次尝试中,我只是尝试为我的 asp:Login 控件设置 DestinationPageUrl 属性。出于某种原因,它要求我同时使用这个和 OnLoggedIn 事件(在 Zerkey 指出之前我不知道这个事件的存在)。返回 URL 中的附加问号也引起了问题,所以这是我在 Login.aspx 中所做的。

标记:

<asp:Login ID="LoginUser" runat=server" EnableViewState="false"
       RenderOuterTable="false" OnLoggedIN="UserLoginOnLoggedIn">...</asp:Login>

代码:

protected void UserLoginOnLoggedIn(object sender, EventArgs e)
    {
        string itemid, itemdept;
        try
        {
            s1 = Request.QueryString["ItemID"].Trim();
            s2 = Request.QueryString["Dept"].Trim();
        }
        catch
        {
            //makes strings null if querystrings aren't present
            s1 = "";
            s2 = "";
        }
        string returnUrl = Request.QueryString["ReturnUrl"] + "&ItemID=" +
            Request.QueryString["ItemID"] + "&Dept=" +
                        Request.QueryString["Dept"];
        if ((!String.IsNullOrEmpty(returnUrl) && !String.IsNullOrEmpty(s1) && 
        !String.IsNullOrEmpty(s2)))
            LoginUser.DestinationPageUrl = returnUrl;
        else
            LoginUser.DestinationPageUrl = "~/Default.aspx";
        Response.Redirect(LoginUser.DestinationPageUrl);
    } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多