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

由于他们来自不同的渠道,我只是好奇 最好的 通向 重定向 用户返回到调用页面。我有一些想法,但希望得到其他开发人员的意见。

你会存储 呼叫 会话中的网址?作为饼干?我喜欢使用对象的概念 处理 重定向。

有帮助吗?

解决方案

我将使用以下方式存储引用 URL 视图状态. 。将其存储在页面范围之外(即如果打开多个浏览器窗口,则可能会导致问题。

下面的示例验证该页面是内部调用的(即不直接请求)并在用户提交响应后弹回到引用页面。

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,但我认为这是一个独立于平台的问题,让所有新的 Web 开发人员在寻求一种“干净”的方式来做到这一点时感到痛苦。

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

  1. url 中的参数
  2. 存储在会话中的 url

我不喜欢 url 方法,它有点混乱,而且你必须记住在每个相关 URL 中包含参数。

我只是使用一个带有静态方法的对象来实现这一点。该对象将环绕您用来存储重定向 URL 的会话项。

这些方法可能如下(均为公共静态):

  • setRedirectUrl(字符串 URL)
  • doRedirect(字符串默认URL)

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

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

我同意“rmbarnes.myopenid.com”的观点,认为此问题与平台无关。

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

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

我的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