私のユーザーは認証されていますが、追加情報が 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 から再読み取りされ、送信されて他のフォーム フィールドに保存されます。それは理にかなっていますか、それは本当にその時ですか:-/