送信をクリックするまでユーザーがログインする必要がなく、ユーザーがログインしている場合はその時点でフォームを送信し、そうでない場合はログインページにリダイレクトするフォームを作成するにはどうすればよいですか。次に、ユーザーが正常にログインした後、元のフォームを送信しますか? 元のフォームにも <input type="file"> 要素があり、ユーザーが正常にログインしない限り、ファイルはアップロードされません。
3 に答える
私はこれが古い投稿であることを知っています。うまくいけば、私の経験が誰かに役立つことを願っています:
2 つの送信ボタンと、両方からフォームの送信を処理するために呼び出される共通のメソッドがあります。条件ステートメントは、どのボタンがフォームを送信しているかを検査します。
ユーザーの認証が必要なボタンで、ユーザーをHttpUnauthorizedResult()
ログイン ページに強制的に戻すために戻っていました。ログイン後、ユーザーはフィールド値が入力されたフォームに戻されます。これは、フィールド値が TempData エントリに格納されていたためです。ただし、ユーザーはデータを送信するためにボタンをもう一度クリックする必要がありました。
AutoSave
そのため、を返す直前に設定されるブール値の TempData 変数を追加しましたHttpUnauthorizedResult()
。フォームを再度ロードする前に確認しAutoSave == true
、送信を処理するメソッドにリダイレクトするかどうかを確認します。魅力のように機能します。
サンプルコードは次のとおりです。
private ActionResult ProcessOnlineApplication(OnlineApplicationViewModel application){
//if not submit make sure it's save.
if (application.SubmitAction == "Save")))
{
if(!User.Identity.IsAuthenticated)
{
//Keep a copy of the application until logged in
TempData["PendingOnlineApplication"] = application;
TempData["AutoSave"] = true;
return new HttpUnauthorizedResult();
}
else{
//Everything goes here
}
}
}
public ActionResult OnlineApplicationForm(){
var viewModel = TempData["PendingOnlineApplication"] as OnlineApplicationViewModel;
if (TempData.ContainsKey("AutoSave") && Convert.ToBoolean(TempData["AutoSave"]) && viewModel != null)
{
TempData["AutoSave"] = false;
return ProcessOnlineApplication(viewModel);
}
if (viewModel == null)
{
viewModel = CreateModel();
}
return GetOnlineApplicationAction(viewModel);
}
MVC はこのシナリオを処理します。"[Authorize]"
[HttpPost] を持つフォーム ポスト アクションにのみ属性を配置するだけです。ユーザーがログインしていないときにフォームを送信すると、アカウント コントローラーのログイン アクション (/Account/Login) にリダイレクトされ、ログイン ビューがレンダリングされます。これは、web.config でそのように設定されているためです。このリダイレクトに加えて、クエリ文字列パラメーター "ReturnUrl=/orginalform" も追加されます。次に、MVC ログイン アクションがログインを実行し、ユーザーを元のフォームに再度リダイレクトします。
更新:フォームデータを保持する必要がある場合にフォームデータをキャプチャするカスタム属性に入れる必要があるコードは次のとおりです(これはテストされておらず、コンパイルされているだけです)
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(
AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string loginUrl = "/Account/Login"; //Get this from web.config instead of hardcode
if (filterContext.HttpContext.Request != null)
{
loginUrl += "?ReturnUrl=" + filterContext.HttpContext
.Request
.Url
.AbsoluteUri;
foreach(var formData in filterContext.HttpContext.Request.Form)
{
loginUrl += "&"+formData.ToString();
}
}
filterContext.Result = new RedirectResult( loginUrl );
}
}
}
ログイン ポスト アクションにいくつかの変更が必要になる場合があります。また、return form get アクションは、URI 文字列からフォーム データを取得し[FromUri]
、フォームを再度レンダリングする必要があります。
プログラムで <input type=file> フィールドに入力することはセキュリティ上のリスクであり、許可されていないため、私が望んでいたことを実行できないことがわかりました。