2

私はこのコードを持っています

[HttpPost]
public ActionResult Index(LoginModel loginModel)
{
    if (ModelState.IsValid)
    { 
       // some lines of code . bla bla bla
       TempData["loginModel"] = loginModel;
       return RedirectToAction("index", "premium");
     }
     ...
}

そしてこのコントローラーはここにあります

public ActionResult Index()
{
   var loginModel = TempData["loginModel"] as LoginModel;
   ...
}

これで、ページが読み込まれると、すべてが正常に機能しているように見えます。しかし、更新すると、すべてが台無しになり、loginModelがnullのようであると表示されます。問題は、現在のログインユーザーを追跡する方法です。フォーム認証を有効にしています。tnx

エラーは以下の通りです


Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web     request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 22: 
Line 23:             var loginModel = TempData["loginModel"] as LoginModel;
Line 24:             string username = loginModel.username;
Line 25:             string password = loginModel.password;
Line 26:             premiumModel.username = username;
4

4 に答える 4

6

錯乱

しかし、更新すると、すべてが台無しになり、loginModelがnullのようになっていると表示されます

答え

これは、キーを読み取ったことが原因でTempDataあり、一度読み取られると、その特定のキーのデータは失われます。

var Value = TempData["keyName"] //Once read, data will be lost

質問

現在のログインユーザーを追跡するにはどうすればよいですか

答え

したがって、データが読み取られた後もデータを永続化するには、以下のようにそれを生きることができます

var Value = TempData["keyName"];
TempData.Keep();                 //Data will not be lost for all Keys
TempData.Keep("keyName");        //Data will not be lost for this Key

TempDataSession変数と同様に、新しいタブ/ウィンドウでも機能します。

変数も使用できますSession。唯一の大きな問題は、Session変数が。と比較して非常に重いことTempDataです。最後に、コントローラー/エリア間でもデータを保持できます。

この投稿がお役に立てば幸いです。

于 2013-06-19T19:28:55.437 に答える
2

ユーザーが認証されたら、ユーザーのID(ユーザー名)を保存するだけで済みます。パスワードは必要ありません。そのため、ASP.NET認証は、ユーザーのIDを認証Cookieに保存することをすでにサポートしており、車輪の再発明を行う必要はありません。Controller.Userプロパティを使用してIDを取得できます。

編集:フォーム認証用にアプリケーションを正しく設定したと想定しています。とにかく、ここにあなたを始めるためのいくつかのハウツー/チュートリアルリンクがあります:

  1. http://www.apexa.net/Blog/web_design_Blog_20100319.aspx
  2. http://www.asp.net/mvc/tutorials/authenticating-users-with-forms-authentication-cs
  3. すべてのアクションに承認属性を適用する必要がないようにソリューションを説明します-http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3 -application.aspx
于 2011-09-29T05:33:31.413 に答える
1

TempData1つのリクエストに対してのみ有効です。したがって、2番目のリクエストを行うと空になります。このようにしたい場合は、Session代わりに使用するか、フォーム認証を確認してください。

また、VinayCのアドバイスを検討し、パスワード情報をどの状態でも、特にクリアテキスト形式で保存しないようにする必要があります。

于 2011-09-29T05:47:51.030 に答える
1

VisualStudioで[ファイル]>[新規]を使用して新しいMVC3プロジェクトを作成することをお勧めします。フォーム認証が設定されるため、ログインページと登録ページのベストプラクティス、セッションCookieを使用したユーザーのサインイン/サインアウト、ユーザー名などのユーザー情報の表示を確認できます。

于 2011-09-29T06:20:25.163 に答える