ASP.NET MVC: как работать с перекрестными данными TempData и ViewData - PullRequest
4 голосов
/ 03 июня 2009

Я пытаюсь найти хороший способ справиться со следующим сценарием (я все еще новичок в этом):

Пользователь может зарегистрироваться через мой сайт, используя провайдера RPX / OpenId.

Шаг 1: Пользователь проходит аутентификацию через провайдера. Поставщик возвращает временный токен одному из моих методов действия.

Шаг 2: я использую токен, чтобы получить информацию о профиле пользователя и загрузить представление, которое позволяет им вводить любые пропущенные обязательные поля и дополнительные поля.

В Шаге 2 я использую 2 метода действий: один для обработки сбора информации с использованием токена. Второе действие, которое берет информацию об авторизации и загружает представление отсутствующих / необязательных полей.

Я передаю информацию авторизации через TempData второму действию. Второе действие может обрабатывать проверку, поэтому есть шанс, что мне нужно будет удерживать объект авторизации более чем для одного запроса. Я не могу использовать токен для регенерации информации авторизации, потому что технически это токен одноразового использования, и было бы глупо регенерировать запрос, поскольку он использует сетевые ресурсы.

Как я могу сохранить объекты в моих TempData для любых последующих запросов к тому же действию, но удалить объекты для любых перенаправлений? И так как это может быть повторяемым шаблоном в моем приложении, я должен создать фильтр для автоматической обработки этой ситуации?

Например, я представляю себе атрибут фильтра, который объединит данные TempData (если они есть) с ViewData. Но как мне сохранить мои данные в будущих вызовах того же действия? Снова закинуть его в TempData? А если я обнаружу перенаправление пустой TempData?

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 июня 2009

Я закончил тем, что заново добавил данные в TempData, если это необходимо. Так как TempData не позволяет вам добавлять дубликаты ключей, я создал свой собственный вспомогательный метод, чтобы удалить, а затем повторно добавить ключ:

public static void AddNew(this TempDataDictionary tempData, string key, object obj)
{
    if ( tempData.ContainsKey( key ) ) tempData.Remove( key );

    tempData.Add( key, obj );
}
1 голос
/ 25 июня 2009

У меня была такая же проблема, но я подошел к ней немного по-другому - я использовал метод проверки подлинности с помощью форм, который работает исключительно с OpenID ... если мой провайдер возвращает Authenticated, я делаю следующее

                var fields = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse;

                if (fields != null)
                {
                    TempData["Email"] = fields.Email;
                    TempData["Nickname"] = fields.Nickname;
                }

                FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, false);

                break;

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

Следовательно, действие, которому это передается, просто скопирует поля TempData, если они заполнены, в ViewData и передаст их в представление.

После этого обрабатывается проверка - мне все равно, что возвращается из OpenID (то есть, является ли он действительным или нет), я разрешаю пользователю отредактировать это и затем сохранить, а затем выполнить мою проверку.

...