我正在开发一个项目管理web应用程序。用户有多种方式来显示任务列表。查看列表页面时,他们会单击任务并重定向到任务编辑页面。
由于它们来自多种方式,我只是好奇将用户重定向回调用页面的最佳方式。我有一些想法,但希望得到其他开发人员的意见。
是否将调用的url存储在会话中?作为饼干?我喜欢使用对象处理重定向的概念。
我正在开发一个项目管理web应用程序。用户有多种方式来显示任务列表。查看列表页面时,他们会单击任务并重定向到任务编辑页面。
由于它们来自多种方式,我只是好奇将用户重定向回调用页面的最佳方式。我有一些想法,但希望得到其他开发人员的意见。
是否将调用的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);
}
}
这条消息将被标记为asp.net,但我认为这是一个独立于平台的问题,让所有新的网络开发人员感到痛苦,因为他们正在寻求一种干净的方法来做到这一点。
我认为实现这一目标的两种选择是:
我不喜欢url方法,它有点乱,你必须记住在每个相关的url中都包含param。
为此,我只使用一个带有静态方法的对象。该对象将环绕用于存储重定向URLS的会话项。
方法可能如下(所有公共静态):
在生成需要重定向到给定url的链接/表单的任何操作中都会调用setRedirectUrl。假设你有一个项目视图操作,它生成了一个项目列表,每个项目都有可以对其执行的任务(例如删除、编辑),你可以在该操作的代码中调用RedirectClass.setRedirectUrl(“/project/view-all”)。
然后,假设用户单击“删除”,则需要在删除操作后将其重定向到视图页面,因此在删除操作中,您将调用RedirectClass.setRirectUrl(“/project/view-all”)。此方法将查看重定向变量是否已在会话中设置。如果是,则重定向到该URL。如果没有,则重定向到默认url(传递给setRedirectUrl方法的字符串)。
我同意“rmbarnes.mymoenid.com”关于这个问题是独立于平台的观点。
我会将调用页面的URL存储在QueryString或隐藏字段中(例如ASP.NET的ViewState)。如果你将其存储在页面范围之外(如Session、全局变量-Application State等),那么它不会像Tom所说的那样过于夸张,还会给你带来麻烦。
什么样的麻烦?如果用户打开了该浏览器的多个选项卡(窗口),则会出现问题。同一浏览器的选项卡(或窗口)可能会共享同一会话,重定向不会是预期的,用户只会觉得这是一个错误。
我的2欧分。。
我个人会将所需的重定向信息存储在一个对象中并全局处理。我会避免使用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;
}
}