关于asp.net:将用户从编辑页面重定向回调用页面

关于asp.net:将用户从编辑页面重定向回调用页面

Redirecting users from edit page back to calling page

我正在开发项目管理Web应用程序。 用户可以通过多种方式来显示任务列表。 在查看列表页面时,他们单击任务,然后重定向到任务编辑页面。

由于它们来自多种方式,因此我很好奇将用户重定向回调用页面的最佳方式。 我有一些想法,但想征询其他开发人员的意见。

您是否可以在会话中存储调用网址? 作为cookie? 我喜欢使用对象处理重定向的概念。


我将使用ViewState存储引用URL。如果打开了多个浏览器窗口,则将其存储在页面范围之外(即处于会话状态或Cookie)可能会导致问题。

以下示例验证了该页面是否在内部被调用(即未直接请求),并在用户提交响应后反弹回引用页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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);
    }
}

对于这个问题,我同意" rmbarnes.myopenid.com"是与平台无关的。

我会将调用页面的URL存储在QueryString或隐藏字段中(例如,在ASP.NET的ViewState中)。如果将其存储在页面范围之外(例如Session,全局变量-应用程序状态等),那么它不仅会像Tom所说的那样过大,还会给您带来麻烦。

什么样的麻烦?如果用户打开了该浏览器的多个标签(窗口),则出现问题。同一浏览器的选项卡(或窗口)可能会共享同一会话,并且重定向不会是预期的,并且所有用户都会感觉到这是一个错误。

我的2欧分


我将此消息标记为asp.net,但我认为这是一个与平台无关的问题,所有新的Web开发人员都在寻求一种"干净"的方法来解决这个问题。

我认为实现这一目标的两个选择是:

  • 网址中的参数
  • 会话中存储的网址
  • 我不喜欢url方法,它有点混乱,您必须记住在每个相关URL中都包含参数。

    我将为此使用带有静态方法的对象。该对象将包装用于存储重定向URL的会话项。

    这些方法可能如下(所有公共静态):

    • setRedirectUrl(字符串URL)
    • doRedirect(字符串defaultURL)

    setRedirectUrl将在产生链接/表单的任何操作中调用,这些链接/表单需要重定向到给定的url。因此,假设您有一个项目视图操作,该操作会生成一个项目列表,每个项目都具有可以对它们执行的任务(例如,删除,编辑),您可以在代码中调用RedirectClass.setRedirectUrl(" / project / view-all")这个动作。

    然后,假设用户单击删除,则需要在执行删除操作后将其重定向到视图页面,因此在删除操作中,您将调用RedirectClass.setRedirectUrl(" / project / view-all")。该方法将查看是否在会话中设置了重定向变量。如果是这样,则重定向到该URL。如果不是,则重定向到默认URL(传递给setRedirectUrl方法的字符串)。


    我个人将所需的重定向信息存储在一个对象中并进行全局处理。我会避免使用QueryString param之类的东西,因为他们可以尝试将自己弹回到他们不应该去的页面上(可能是安全问题?)。然后,您可以创建一个静态方法来处理重定向对象,该方法可以读取信息并采取相应的措施。这会将您的重定向过程封装在一页内。

    使用对象还意味着您以后可以根据需要扩展它(例如添加返回消息和其他信息)。

    例如(这是2分钟的粗略指南BTW!):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    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;
        }
    }


    推荐阅读