Response.Redirect() to redirect to a page in a subfolder

70,747

Solution 1

Your problem is that you're doing a redirect from a MasterPage, and using a relative path.

When you use a relative path, it will be relative to the location of the content page that is bound to the master page, not relative to the location of the Master Page.

Your redirection to :

/BuzzEnhance/Account/Account/Login.aspx

is almost certainly coming from a content page in the Account folder that is bound to your master page. For example, if your Login page (/BuzzEnhance/Account/Login.aspx) is itself bound to that Master page, it will redirect to the relative path Account/Login.aspx, which will resolve to /BuzzEnhance/Account/Account/Login.aspx, exactly what you're seeing.

The best solution is in the answer from @abatishchev - use a path relative to the application root ~/Account/Login.aspx.

However, this will give you another problem if, as I suspect, your Login.aspx page is bound to the same master page. Each time you access Login.aspx, it will execute the redirect code in the master page, resulting in an infinite loop until something times out.

One solution is either to avoid binding your Login.aspx page to that Master page, or to add some conditional code so you don't redirect when on the Login.aspx page.

Though even better, you should not need to do a redirect at all if you use Forms Authentication and leave it to manage redirection to the login page in the standard way. If you want to display the username, you can use HttpContext.Current.User.Identity.Name - or use one of the ASP.NET Login controls: LoginStatus, LoginName, ...

Solution 2

"~/Account/Login.aspx"

will give

"<app root>/Account/Login.aspx"

so if your apps' root is

http://localhost/BuzzEnhance

the relative path given will be expanded to

http://localhost/BuzzEnhance/Account/Login.aspx

Also if you're using Forms Authentication, you may want to use

FormsAuthentication.RedirectToLoginPage();

see MSDN.

Solution 3

First of all its not responce.redirect("page.aspx");

its Response.Redirect("Page.aspx");

Try in this way it will work. As per your question its Response.Redirect("folder/page.aspx"); try now, I will be waiting.

Keep in mind in C# first letter should be capitalized.

Solution 4

What you need is this:

Response.Redirect("/Account/Login.aspx");

This will go to Account that reside inside the root and in there to Login.aspx page.

Share:
70,747
user614946
Author by

user614946

Updated on April 02, 2021

Comments

  • user614946
    user614946 about 3 years

    I am using a Response.Redirect("login.aspx");

    Since I moved my login.aspx to my Account subfolder, I tried the following code, however it doesn't work.

    Response.Redirect("Account/login.aspx");
    

    The URL this tries to redirect to this:

    http://localhost/BuzzEnhance/Account/Login.aspx
    

    The full code is:

    public partial class BuzzMaster : MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Session["Username"] != null)
                {
                    username.Text = Session["Username"].ToString();
                }
                else
                {
                    Response.Redirect("Account/Login.aspx");
                }
            }
        }    
    }
    

    and one more thing both the default page and login page use the same master page.

  • Shadow The Kid Wizard
    Shadow The Kid Wizard over 12 years
    Problem is the page with the code is already inside different sub folder, called "BuzzEnhance" so the relative path is relative to that location.
  • user614946
    user614946 over 12 years
  • user614946
    user614946 over 12 years
    @ShadowWizard it still HTTP Error 400 - Bad Request.
  • user614946
    user614946 over 12 years
    @ShadowWizard so now what should i do??
  • abatishchev
    abatishchev over 12 years
    @user614946: Note that I've removed port number as being unimportant.
  • abatishchev
    abatishchev over 12 years
    @user614946: Does url http://<any>/BuzzEnhance/Account/Login.aspx really exist?
  • abatishchev
    abatishchev over 12 years
    @user614946: Post the whole app folder structure, please.
  • user614946
    user614946 over 12 years
    yes the folder is there and the file Login.aspx is in it ... i cant figure it out that why i posted it in here ..@ShadowWizard
  • abatishchev
    abatishchev over 12 years
    @user614946: Account/Account/Login.aspx or just Account/Login.aspx ?!
  • user614946
    user614946 over 12 years
    BuzzEnhance\Account\Login.aspx .. i tested when i put it in the root and call only response.redirect("login.aspx"); page is called .. but when placed in Account folder which is in the root folder it gives error @abatishchev
  • user614946
    user614946 over 12 years
    just Account/Login.aspx @abatishchev
  • abatishchev
    abatishchev over 12 years
    @user614946: then "~/Account/Login.aspx" should work. Try use Server.MapPath(string) to check how is ~ being expended.
  • user614946
    user614946 over 12 years
    i dont know why its not working .. i am using my above given code .. and "~/Account/Login.aspx but i get problem loading page!
  • abatishchev
    abatishchev over 12 years
    @user614946: Have you tried Server.MapPath() to debug resulting path?
  • user614946
    user614946 over 12 years
    @abatishchev yes and it gives me the path but of my machine .. when i give our method a try it say problem loading page.. and no auths ..
  • Joe
    Joe over 12 years
    @user614946 - "...it say problem loading page." probably because Login.aspx is bound to the Master page, and it's looping - see my answer.
  • abatishchev
    abatishchev over 12 years
    @user614946: Yes, it's so it works: converts relative web path to physical, so you could check does it really exist, etc. Does it?