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とRazorを使用しています

ページの上部に Fullname / 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>

これは、このコードをコントローラーに含める必要がないことを意味しますが、正直言って気に入らず、実際のアプリ (異なる値) では、レイアウトを含むビューの大部分で値が必要です。

そのため、コントローラー内にコードを含めることについて議論しました。

ビューモデルを作成します。

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);

    }

たぶん、これのいくつかはコントローラーファクトリー内に置くことができます。

他の人々がこの非常に一般的なセットアップにどのように取り組んでいるかについての議論やアイデアを探しています。

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

4

1 に答える 1

0

私は最近のプロジェクトでこの正確なことに数回対処しました。

これをコントローラーに配置するよりも、FormsAuthentication 固有のコードをラップする認証サービスを作成し、必要な場所に IoC を介してそのサービスを挿入することをお勧めします。ほとんどすべての IoC コンテナーは、認証サービスを http 要求ごとにキャッシュできることも指定できるはずなので、それを利用してリソースを節約し、パフォーマンスを向上させることができます。

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

于 2011-02-11T03:07:09.833 に答える