Посмотреть модель для пользовательских данных пользователя на странице макета - PullRequest
0 голосов
/ 11 февраля 2011

Мой пользователь прошел проверку подлинности, но хранит дополнительную информацию в 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);

Создание файла cookie и т. Д.

Все это работает нормально.

Я использую mvc 3 и Razor

У меня есть foo.Layout.cshtml, который отображает полное имя / ContactNumber и т. Д. В верхней части страницы.

Я мог бы включить код в верхней части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 и отправлено на хранение в другие поля формы.Имеет ли это смысл и действительно ли это время: - /

1 Ответ

0 голосов
/ 11 февраля 2011

Я обращался к этой проблеме пару раз в недавних проектах.

Даже лучше, чем поместить это в контроллер, было бы создать службу аутентификации, которая упаковывает ваш специфичный для FormsAuthentication код, а затем внедрить эту службучерез IoC везде, где это может понадобиться.Практически любой IoC-контейнер должен также указывать, что ваша служба аутентификации может кэшироваться для каждого запроса http, так что вы можете воспользоваться этим для экономии ресурсов и повышения производительности.

Теперь, если вам нужно отобразитьВо многих местах этой пользовательской информации я бы посоветовал вам создать отдельный UserController и вызывать его с помощью RenderAction везде, где требуется информация о пользователях в ваших представлениях, вместо того, чтобы сделать вашу модель пользовательского представления частью других моделей представления.(если это на самом деле не нужно другим моделям / представлениям для удовлетворения некоторых бизнес-условий и т. д.).Таким образом, вы можете иметь стандартное, «каноническое» представление информации о пользователе как компонента, и вы получите много повторного использования.

...