2009-06-03 2 views
4

Я пытаюсь найти хороший способ справиться следующий сценарий (я до сих пор своего рода новичок в этом):ASP.NET MVC: Как обрабатывать TempData кросс-действий и ViewData

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

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

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

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

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

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

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

Благодаря

ответ

3

В результате я снова добавил данные в 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

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

   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 (т. Е. Является ли оно действительным или нет), я разрешаю пользователю редактировать это, а затем сохранять, а затем выполнять мою проверку.

+0

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

Смежные вопросы