2011-01-24 8 views
1

マイログインアクションはもともと、このように見えた:asp.net MVCアプリケーションのログイン中にjavascriptを検出しています...このコードは大丈夫ですか?

return new RedirectResult(nameValueCollection["ReturnUrl"]); 

をしかし、私はクライアントのJavaScriptのホーム・ページがロードされる前に有効になっているかどうかを知っていただきたいと思いますので、私はこれにそれを変更:

return View(new LogInViewModel { ReturnUrl = nameValueCollection["ReturnUrl"] }); 

そして、インスタントリダイレクトするのではなく、次のビューを送信します。

@model Obr.Web.Models.LogInViewModel 

@{ 
    Layout = null; 
    string noJSReturnUrl = Model.ReturnUrl + (Model.ReturnUrl.Contains("?") ? "&" : "?") + "noJS=true"; 
} 

<!doctype html> 

<html> 
    <head> 
     <title>Loggin in...</title> 
     <meta http-equiv="REFRESH" content="1;[email protected]"> 
     <script type="text/javascript"> 
      window.location = "@Model.ReturnUrl"; 
     </script> 
    </head> 
    <body> 
     <noscript> 
      Loggin in...<br /> 
      <a href="@noJSReturnUrl">Click here if you are not redirected promptly.</a> 
     </noscript> 
    </body> 
</html> 

アイデアがあるユーザーが持っていない場合、JavaScriptが有効になっていることを、彼らが見短い読み込みメッセージ、および1秒後にホームページが読み込まれます。 JavaScript の場合、ページはすぐにリロードされます。将来、ビューポートなどの寸法をサーバーに投稿することもできます。

これは正常に動作しますか? window.locationコマンドの実行に1秒以上かかる場合は、メタリフレッシュによって中断されますか、またはリフレッシュがブロックされますか?私は後者を望んでいるので、私はそれらの非jsの人々のために遅延を増やす必要はありません。

私の新しいやり方は、リダイレクトのペイロードにわずかな重さを加えていますが、それは余分な往復ではありません。とにかくリダイレ​​クトが発生しますが、そうではありませんか?

更新:私は非常に重要な点に言及しなかった。私は実際にログイン画面そのもの、それが投稿するページだけを制御するわけではありません。このコードは、外部認証メカニズムに依存する製品の一部です。

答えて

0

元のログインフォームを変更することはできないので、あなたのソリューションはよさそうです。 JSを持っているユーザーには何も表示されず、特別なホップだけで別のリダイレクトのように見えるはずです。

新しいURLをwindow.locationに書き込むと、ブラウザは現在のページのjsとタイマーとすべての処理を停止し、次のページの取得/処理に移ります。

+0

更新された答えをありがとう!私はこれでロールします。 – Chris

1

javascriptを検出するだけのリダイレクトは不要です。ユーザーがログインした元のフォームで、隠しフォーム要素javaScriptEnabledを作成し、デフォルト値はfalseです。次に、JavaScriptを使用して値をtrueに設定します。次に、この値をハンドラで読み取ることができます。それが本当であれば、JSが有効になります。

追加のページは必要ありません。

+0

ああ、それは完全に有効ですが、私はそれが私のための選択肢ではないと言いました。私は外部にログインした製品を出荷します。あなたのソリューションは完璧です。 – Chris

+0

@Chris、それは意味する –

関連する問題