#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 аутентификации, и вам не нужно заново изобретать колесо. Вы можете получить идентификатор с помощью контроллера.Свойство пользователя.
РЕДАКТИРОВАТЬ: я предполагаю, что вы правильно настроили свое приложение для проверки подлинности форм. Несмотря на это, вот несколько ссылок с практическими рекомендациями / учебными пособиями, которые помогут вам разобраться в этом:
- http://www.apexa.net/Blog/web_design_Blog_20100319.aspx
- http://www.asp.net/mvc/tutorials/authenticating-users-with-forms-authentication-cs
- Объясните решение, чтобы вам не приходилось применять атрибут авторизации к каждому действию — 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
наследуется должным образом .