asp.net mvc поддерживает объект в рабочем состоянии, информация

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-4

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-4

Вопрос:

у меня есть этот код

 [HttpPost]
public ActionResult Index(LoginModel loginModel)
{
    if (ModelState.IsValid)
    { 
       // some lines of code . bla bla bla
       TempData["loginModel"] = loginModel;
       return RedirectToAction("index", "premium");
     }
     ...
}
  

и этот контроллер здесь

 public ActionResult Index()
{
   var loginModel = TempData["loginModel"] as LoginModel;
   ...
}
  

теперь, когда страница загружается, кажется, что все работает нормально. но когда я обновляю, все путается, он говорит, что LoginModel имеет значение null. вопрос в том, как мне нравится отслеживать текущих пользователей, входящих в систему. у меня включена проверка подлинности форм. tnx

ошибка, как показано ниже


 Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web     request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 22: 
Line 23:             var loginModel = TempData["loginModel"] as LoginModel;
Line 24:             string username = loginModel.username;
Line 25:             string password = loginModel.password;
Line 26:             premiumModel.username = username;
  

Комментарии:

1. кроме того, когда мы обновляем страницу, она не переходит в [HTTPPOST], поскольку это не тип post . он переходит к обычному контроллеру, как обычный контроллер может узнать своего того же посетителя и узнать имя пользователя и пароль. в нем включен файл cookie. есть идеи?

2. кстати, TempData сохраняет свои значения до следующего доступа, поэтому вы можете использовать значение только один раз, вот почему оно так называется =)

3. @Alexander есть идеи, как использовать свойство controller.user? tnx

4. просто используйте this.User где-нибудь в действии вашего контроллера

Ответ №1:

Путаница

но когда я обновляю, все портится, в нем говорится, что LoginModel имеет значение null

Ответ

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

 var Value = TempData["keyName"] //Once read, data will be lost
  

Вопрос

как мне нравится отслеживать текущих пользователей, входящих в систему

Ответ

Таким образом, чтобы сохранить данные даже после считывания данных, вы можете оживить их, как показано ниже

 var Value = TempData["keyName"];
TempData.Keep();                 //Data will not be lost for all Keys
TempData.Keep("keyName");        //Data will not be lost for this Key
  

TempData также работает в новых вкладках / окнах, как Session и переменная.

Вы также можете использовать Session переменную, единственная серьезная проблема заключается в том, что Session переменная очень тяжелая TempData по сравнению с. Наконец, вы также можете сохранять данные между контроллерами / областями.

Надеюсь, этот пост вам очень поможет.

Ответ №2:

Вам нужно сохранить идентификатор пользователя (имя пользователя) только после аутентификации пользователя — пароль не требуется. Как таковой ASP.NET аутентификация уже поддерживает сохранение идентификатора пользователя в файле cookie аутентификации, и вам не нужно заново изобретать колесо. Вы можете получить идентификатор с помощью контроллера.Свойство пользователя.

РЕДАКТИРОВАТЬ: я предполагаю, что вы правильно настроили свое приложение для проверки подлинности форм. Несмотря на это, вот несколько ссылок с практическими рекомендациями / учебными пособиями, которые помогут вам разобраться в этом:

  1. http://www.apexa.net/Blog/web_design_Blog_20100319.aspx
  2. http://www.asp.net/mvc/tutorials/authenticating-users-with-forms-authentication-cs
  3. Объясните решение, чтобы вам не приходилось применять атрибут авторизации к каждому действию — http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx

Комментарии:

1. tnx, не могу найти способ, как использовать контроллер. Свойство пользователя. есть идеи>?

2. Controller.User это не статическое свойство — вам нужен экземпляр Controller класса. Ваш контроллер наследует Controller класс, поэтому, когда вы используете методы действия вашего контроллера, такие как ваше Index() действие, this.User выдает вам объект user.

3. @nekno, не могу создать объект, потому что класс контроллера является абстрактным или интерфейсным. попробуйте, если хотите. есть идеи? спасибо

4. @user963499, как указал некно, просто используйте this.User внутри кода вашего контроллера

5. @user963499 — вы бы использовали один из ваших методов действий, например, два Index действия, которые вы опубликовали this.User . Если вы хотите получить ссылку на пользователя в вашем представлении, вы можете использовать Context.User свойство, т. е. @Context.User.Identity.Name .

Ответ №3:

TempData работает только для одного запроса. Поэтому он пуст, когда вы делаете второй запрос. Если вы хотите сделать это так, вам следует использовать Session вместо этого, или вы можете взглянуть на аутентификацию форм.

Вы также должны учитывать рекомендации VinayC и не хранить информацию о пароле в любом состоянии, особенно не в открытом текстовом формате.

Ответ №4:

Я предлагаю вам создать новый проект MVC 3 в Visual Studio через File> New . Он настроит для вас аутентификацию в формах, чтобы вы могли ознакомиться с рекомендациями для страниц входа и регистрации, входа / выхода пользователя с помощью файла cookie сеанса и отображения информации о пользователе, такой как имя пользователя.

Комментарии:

1. контроллер — это статический класс, как я могу получить доступ к controller.user не может получить к нему доступ. tnx

2. Нет, Controller ЭТО НЕ статический класс. Ваш контроллер, то есть ваш AccountController , или LoginController , или любой другой класс контроллера, в котором вы находитесь, где вы разместили свой код для Index действий — это класс контроллера. Внутри этого кода вы можете использовать this.User , если вы правильно настроили свой контроллер для наследования от Controller класса, т. Е. public class AccountController : Controller . Я даже не знаю, как ваш код будет работать как контроллер MVC, если он не Controller наследуется должным образом .