将用户从编辑页面重定向回调用页面

时间:2008-08-31 09:49:18

标签: asp.net redirect

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

由于它们来自各种各样的方式,我只是好奇最好方式重定向用户回到调用页面。我有一些想法,但希望得到其他开发人员的意见。

您会在会话中存储调用网址吗?作为一个cookie?我喜欢使用对象句柄重定向的概念。

4 个答案:

答案 0 :(得分:5)

我会使用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 :(得分:1)

我个人会将所需的重定向信息存储在对象中并全局处理。我会避免使用QueryString参数等,因为他们可以尝试将自己弹回到他们不应该的页面(可能的安全问题?)。然后,您可以创建一个静态方法来处理重定向对象,该方法可以读取信息并相应地执行操作。这将您的重定向过程封装在一个页面中。

使用对象也意味着您可以在以后扩展它(如添加返回消息和其他信息)。

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

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;
    }
}

答案 2 :(得分:1)

此消息我被标记为asp.net,但我认为这是一个独立于平台的问题,所有新的Web开发人员都在寻求一种“干净”的方式来解决这个问题。

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

  1. 网址中的参数
  2. 存储在会话中的网址
  3. 我不喜欢url方法,它有点乱,你必须记住在每个相关的URL中包含param。

    我只是使用一个带有静态方法的对象。该对象将环绕用于存储重定向URLS的会话项。

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

    • setRedirectUrl(string URL)
    • doRedirect(string defaultURL)

    setRedirectUrl将在生成需要重定向到给定URL的链接/表单的任何操作中调用。所以说你有一个项目视图动作,它生成一个项目列表,每个项目都有可以对它们执行的任务(例如删除,编辑),你可以在代码中调用RedirectClass.setRedirectUrl(“/ project / view-all”)这个动作。

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

答案 3 :(得分:1)

我同意“rmbarnes.myopenid.com”关于此问题与平台无关。

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

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

我的2欧元..