0

ユーザーは認証されていますが、FormsAuthenticationTicketに保存されていてCookieに追加情報が格納されています。[レイアウト]ページのカスタムユーザーデータのモデルを表示

// Custom UserData will contain the following | seperated values: 
// [ FullName | ContactNumber1 | ContactNumber2 ] 
string userData = fullName + "|" + contactNumber1 + "|" + contactNumber2 

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
               1, 
               userName, 
               DateTime.Now, 
               DateTime.Now.AddMinutes(20), 
               false, 
               userData, 
               FormsAuthentication.FormsCookiePath); 

このすべてが正常に動作している

クッキーなどなどを作成します。 MVC 3とレイザー

を使用して

イム私は、ページの上部にフルネーム/ ContactNumberなどなどを表示するfoo.Layout.cshtmlを持っています。

私は、ディスプレイにこれらの値を抽出するためにfoo.Layout.cshtmlの上部にコードを含めることができます

@{ 

    FormsAuthenticationTicket ticket = ((FormsIdentity)User.Identity).Ticket; 

    // Custom UserData will contain the following | seperated values: 

    // [ FullName | ContactNumber1 | ContactNumber2 ] 

    string[] userData = ticket.UserData.Split(new char[] { '|' }); 

    string fullName = userData[0]; 

    string contactNumber1 = userData[1]; 

    string contactNumber2 = userData[2]; 

} 

<div>@fullName</div> 

<div>@contactNumber1</div> 

<div>@contactNumber2</div> 

これは私が、私はいけない私のコントローラでこのコードを含める必要がなく、正直に言うといけないこと私の実際のアプリ(異なる値)のように、私はレイアウトを含む私の意見の大部分の値が必要です。

だから私は私のコントローラ内のコードを含め議論している:

はのviewmodelを作成します。

public class UserViewModel { 

    public string FullName { get; set; } 

    public string ContactNumber1 { get; set; } 

    public string ContactNumber2 { get; set; } 

} 

はたぶんこれのいくつかは、コントローラの工場内に置くことができコントローラー

public class FooController : Controller { 

    private readonly _userViewModel = null; 

    public FooController() { 

     // NOTE this would actually be behind an interface in some type of 
     //  repository/service pattern and injected but for the sake 
     //  of easy conversation ive put it here. 

     FormsAuthenticationTicket ticket = ((FormsIdentity)User.Identity).Ticket; 

     // Custom UserData will contain the following | seperated values: 
     // [ FullName | ContactNumber1 | ContactNumber2 ] 
     string[] userData = ticket.UserData.Split(new char[] { '|' }); 

     _userViewModel = new UserViewModel(); 

     userViewModel.FullName = userData[0]; 
     userViewModel.ContactNumber1 = userData[1]; 
     userViewModel.ContactNumber2 = userData[2]; 

    } 

    public ActionResult Index() { 

     (HOWEVER_SET_ON_LAYOUT_PAGE) = userViewModel.FullName; 

     // If not posting ViewModel    
     (HOWEVER_SET_ON_THIS_PAGE) = userViewModel.FullName; 

     // If posting ViewModel 
     return View(_userViewModel); 

    } 

を作成します。 。

他の人がどのようにこの非常に一般的な設定に近づいているかについての議論やアイデアを探しています。

私の実際の作業はレイアウトを介して各ページの上部にユーザーのフルネームを表示し、記入されてから提出されるさまざまなフォームの下部にフルネーム(およびその他のデータ)を表示することです。ポストバック後、フルネームはクッキーから再度読み込まれ、他のフォームフィールドと共に保存されるように送信されます。それは理にかなっていて、本当にその時です: -/

答えて

0

最近のプロジェクトでは、この正確なことを2回繰り返しました。

これをコントローラに追加するよりも、FormsAuthentication固有のコードをラップする認証サービスを作成し、必要な場合がある場所でIoC経由でそのサービスを注入する方がよいでしょう。ほとんどのIoCコンテナでは、認証サービスをHTTPリクエストごとにキャッシュできるように指定する必要があります。そのため、リソースを節約してパフォーマンスを向上させることができます。

ここでこのユーザー情報を表示する必要がある場合は、別のUserControllerを作成し、ビューにユーザー情報を表示する代わりにユーザー情報が必要な場所でRenderAction呼び出しを実行することをおすすめしますいくつかのビジネス条件を満たすために他のモデル/ビューで実際に必要な場合を除き、他のビューモデルの一部をモデル化します。このようにして、ユーザー情報の標準的な「標準的な」ビューをコンポーネントとして持つことができます。その結果、多くの再利用が可能になります。

+0

実際の例を教えてください。 –