Перенаправление пользователей со страницы редактирования обратно на страницу вызова - PullRequest
7 голосов
/ 31 августа 2008

Я работаю над веб-приложением по управлению проектами. У пользователя есть множество способов отображения списка задач. При просмотре страницы списка они нажимают на задачу и перенаправляются на страницу редактирования задачи.

Поскольку они поступают различными способами, мне просто любопытно, как лучше всего перенаправить пользователя * обратно на страницу вызова. У меня есть некоторые идеи, но я хотел бы узнать мнение других разработчиков.

Будете ли вы хранить вызывающий URL в сеансе? как печенье? Мне нравится концепция использования объекта handle перенаправление.

Ответы [ 4 ]

5 голосов
/ 31 августа 2008

Я бы сохранил URL-адрес, используя ViewState . Хранение этого вне области страницы (то есть в состоянии сеанса или cookie) может вызвать проблемы, если открыто более одного окна браузера.

В приведенном ниже примере проверяется, что страница была вызвана внутренне (то есть не запрашивается напрямую), и возвращается на ссылающуюся страницу после того, как пользователь отправил свой ответ.

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.UrlReferrer == null)
        {
            //Handle the case where the page is requested directly
            throw new Exception("This page has been called without a referring page");
        }

        if (!IsPostBack)
        {   
            ReturnUrl = Request.UrlReferrer.PathAndQuery;
        }
    }

    public string ReturnUrl
    {
        get { return ViewState["returnUrl"].ToString();  }
        set { ViewState["returnUrl"] = value; }
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        //Do what you need to do to save the page
        //...

        //Go back to calling page
        Response.Redirect(ReturnUrl, true);
    }
}
1 голос
/ 31 августа 2008

Я согласен с "rmbarnes.myopenid.com" в отношении этой проблемы как независимой от платформы.

Я бы сохранял URL вызывающей страницы в QueryString или в скрытом поле (например, в ViewState для ASP.NET). Если вы будете хранить его вне области страницы (например, «Сессия», глобальная переменная - «Состояние приложения» и т. Д.), То, как сказал Том, это не будет просто излишним, но доставит вам неприятности.

Что за беда? Проблема, если у пользователя открыто более одной вкладки (окна) этого браузера. Вкладки (или окна) одного и того же браузера, вероятно, будут использовать один и тот же сеанс, и перенаправление не будет ожидаемым, и все, что пользователь почувствует, это то, что это ошибка.

Мои 2 евроцента ..

1 голос
/ 31 августа 2008

Это сообщение может быть помечено как asp.net, но я думаю, что это независимая от платформы проблема, которая мучает всех новых веб-разработчиков, поскольку они ищут «чистый» способ сделать это.

Я думаю, что для достижения этого есть два варианта:

  1. Параметр в URL
  2. URL-адрес, сохраненный в сеансе

Мне не нравится метод url, он немного запутанный, и вы должны помнить, что нужно включать параметр в каждый соответствующий URL.

Я бы просто использовал для этого объект со статическими методами. Объект будет оборачиваться вокруг элемента сеанса, который вы используете для хранения URL-адресов перенаправления.

Методы, вероятно, будут следующими (все общедоступные статические):

  • setRedirectUrl (строковый URL)
  • doRedirect (строка defaultURL)

setRedirectUrl вызывается в любом действии, которое создает ссылки / формы, которые необходимо перенаправить на заданный URL-адрес. Допустим, у вас было действие просмотра проектов, которое генерирует список проектов, в каждом из которых есть задачи, которые могут быть выполнены над ними (например, удаление, редактирование), которые вы бы назвали RedirectClass.setRedirectUrl ("/ project / view-all") в коде для это действие.

Затем, допустим, пользователь нажимает кнопку «Удалить», его необходимо перенаправить на страницу просмотра после действия удаления, поэтому в действии удаления вы должны вызвать RedirectClass.setRedirectUrl («/ project / view-all»). Этот метод проверяет, была ли установлена ​​переменная перенаправления в сеансе. Если это так, перенаправьте на этот URL. Если нет, перенаправьте на URL-адрес по умолчанию (строка, переданная методу setRedirectUrl).

1 голос
/ 31 августа 2008

Я лично буду хранить необходимую информацию о перенаправлении в объекте и обрабатывать глобально. Я бы не стал использовать параметр QueryString или тому подобное, поскольку они могли бы попытаться отскочить назад на страницу, на которую они не должны (возможная проблема безопасности?) Затем вы можете создать статический метод для обработки объекта перенаправления, который может считывать информацию и действовать соответственно. Это инкапсулирует ваш процесс перенаправления в пределах одной страницы.

Использование объекта также означает, что вы можете позже расширить его, если это необходимо (например, добавить ответные сообщения и другую информацию).

Например (это грубое указание на 2 минуты!):

public partial class _Default : System.Web.UI.Page 
{

    void Redirect(string url, string messsage)
    {
        RedirectionParams paras = new RedirectionParams(url, messsage);
        RedirectionHandler(paras); // pass to some global method (or this could BE the global method)
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Redirect("mypage.aspx", "you have been redirected");
    }
}

public class RedirectionParams
{
    private string _url;

    public string URL
    {
        get { return _url; }
        set { _url = value; }
    }

    private string _message;

    public string Message
    {
        get { return _message; }
        set { _message = value; }
    }

    public RedirectionParams(string url, string message)
    {
        this.URL = url;
        this.Message = message;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...