Перенаправление пользователей со страницы редактирования обратно на страницу вызова

StackOverflow https://stackoverflow.com/questions/36733

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Не могли бы вы сохранить зовущий url-адрес в сеансе?в виде печенья?Мне нравится концепция использования объекта ручка перенаправление.

Это было полезно?

Решение

Я бы сохранил ссылочный URL-адрес, используя ViewState . Хранение этого вне области страницы (то есть в состоянии Session или 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);
    }
}

Другие советы

Это сообщение должно быть помечено 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).

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

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

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

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

Я лично буду хранить необходимую информацию о перенаправлении в объекте и обрабатывать его глобально. Я бы не стал использовать параметр 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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top