ユーザーを編集ページから呼び出しページにリダイレクトする
質問
私はプロジェクト管理 Web アプリケーションに取り組んでいます。ユーザーはさまざまな方法でタスクのリストを表示できます。リスト ページを表示しているときにタスクをクリックすると、タスク編集ページにリダイレクトされます。
いろいろな経路から来ているので、ちょっと興味があります。 最高 する方法 リダイレクト ユーザーは呼び出し元のページに戻ります。いくつかアイデアはありますが、他の開発者の意見も聞きたいと思っています。
保管していただけますか 電話をかける セッション中のURL?クッキーとして?オブジェクトを使用するというコンセプトが好きです ハンドル リダイレクト。
解決
を使用して参照URLを保存します ビューステート. 。これをページの範囲外に保存する (つまり、セッション状態または 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 としてタグ付けされる可能性がありますが、これはプラットフォームに依存しない問題であり、これを行うための「クリーンな」方法を求めるすべての新しい Web 開発者を悩ませていると思います。
これを実現するには次の 2 つの選択肢があると思います。
- URL内のパラメータ
- セッションに保存された URL
私は URL メソッドが好きではありません。少し面倒で、関連するすべての URL にパラメータを忘れずに含める必要があります。
これには静的メソッドを持つオブジェクトを使用するだけです。このオブジェクトは、リダイレクト URL を保存するために使用するセッション アイテムをラップします。
メソッドはおそらく次のようになります (すべて public static)。
- setRedirectUrl(文字列 URL)
- doRedirect(文字列デフォルトURL)
setRedirectUrl は、指定された URL にリダイレクトする必要があるリンク/フォームを生成するアクションで呼び出されます。たとえば、プロジェクトのリストを生成するプロジェクト ビュー アクションがあり、各プロジェクトに対して実行できるタスクが含まれているとします (例:delete、edit)、このアクションのコードでは RedirectClass.setRedirectUrl("/project/view-all") を呼び出します。
次に、ユーザーが削除をクリックしたとします。削除アクションの後にビュー ページにリダイレクトする必要があるため、削除アクションで RedirectClass.setRedirectUrl("/project/view-all") を呼び出します。このメソッドは、リダイレクト変数がセッションに設定されているかどうかを確認します。その場合は、その URL にリダイレクトします。そうでない場合は、デフォルトの URL (setRedirectUrl メソッドに渡される文字列) にリダイレクトします。
私は、この問題がプラットフォームに依存しないという点に関して「rmbarnes.myopenid.com」に同意します。
呼び出し元のページ URL を QueryString または非表示フィールド (ASP.NET の ViewState など) に保存します。ページのスコープ外 (セッション、グローバル変数 - アプリケーションの状態など) に保存する場合は、トムが言ったように過剰なだけではなく、問題が発生します。
どのようなトラブルですか?ユーザーがそのブラウザの複数のタブ (ウィンドウ) を開いている場合に問題が発生します。同じブラウザのタブ (またはウィンドウ) はおそらく同じセッションを共有し、リダイレクトは予期したものではなく、ユーザーはそれがバグだと感じるだけでしょう。
私の2ユーロセント..
私は個人的に、必要なリダイレクト情報をオブジェクトに保存し、グローバルに処理します。QueryString パラメータなどの使用は避けたいと思います。なぜなら、意図しないページに戻ってしまう可能性があるからです (セキュリティ上の問題の可能性がありますか?)。次に、リダイレクト オブジェクトを処理する静的メソッドを作成し、情報を読み取り、それに応じて動作することができます。これにより、リダイレクト プロセスが 1 ページ内にカプセル化されます。
オブジェクトを使用するということは、必要に応じて後でそれを拡張できることも意味します (リターン メッセージやその他の情報の追加など)。
たとえば (ちなみに、これは 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;
}
}