Несколько форм на одной странице ASP.net MVC - PullRequest
11 голосов
/ 03 апреля 2012

Я работаю над своим первым проектом ASP.net MVC, и у меня возникли проблемы с использованием нескольких форм на одной странице.Сначала я создал 2 частичных класса: (* Регистрация позволит пользователю зарегистрироваться, * Вход в систему позволяет пользователю войти в систему.)

Затем я использовал HTML.render, чтобы интегрировать их в мою «Журнал».Так что я должен использовать 2 различных действия.Вот так:

        [HttpPost]
    public ActionResult Login(LogModel.Login Model)
    {
        if (ModelState.IsValid)
        {

            if (LogModel.Login.Verifuser(Model.IDUser, Model.Password))
            {
                FormsAuthentication.SetAuthCookie(Model.IDUser, false);
                if (LogModel.Login.IsAdmin(Model.IDUser, Model.Password))
                {
                    return View("Admin/Index");
                }
                else
                {
                    return View("Agence/Index");
                }
            }
            else
            {
                ModelState.AddModelError("", "Invalide username or Password");
                return View(Model);
            }
        }
        return View(Model);
    }

Проблема в том, что в случае ошибки я перенаправляю на новую страницу (Белая страница содержит сводку проверки).Поэтому я удивляюсь, как показать это сообщение об ошибке на странице по умолчанию на моей странице.

Ответы [ 2 ]

26 голосов
/ 03 апреля 2012

Вы можете решить это с помощью трех действий и сложной модели.

 public class LoginOrRegisterViewModel
 {
      public Models.RegisterViewModel Register { get; set; }
      public Models.LoginViewModel Login { get; set; }
 }


 [HttpGet]
 public ActionResult Login()
 {
      return View("Login", new LoginOrRegisterViewModel());
 }

 [HttpPost]
 public ActionResult Register(Models.LoginViewModel model)
 {
      if(!ModelState.IsValid)
           return View("Login", new LoginOrRegisterViewModel(){ Register = model });
      else
      {
           //TODO: Validate the user
           //TODO: Write a FormsAuth ticket
           //TODO: Redirect to somewhere
     }
 }

 [HttpPost]
 public ActionResult Login(Models.RegistrationViewModel model)
 {
      if(!ModelState.IsValid)
           return View("Login", new LoginOrRegisterViewModel(){ Login = model});
      else
      {
           //TODO: CRUD for registering user
           //TODO: Write forms auth ticket
           //TODO: Redirect
     }
 }

В своем коде убедитесь, что вы установили действие формы:

 @model Models.LoginOrRegisterViewModel

 @using(Html.BeginForm("Login", "Controller", FormMethod.Post, new { id = "loginForm"}))
 {
       @Html.EditorFor(m => Model.Login)
 }

 @using(Html.BeginForm("Register", "Controller", FormMethod.Post, new { id = "registerForm"}))
 {
       @Html.EditorFor(m => Model.Register)
 }
0 голосов
/ 03 апреля 2012

Похоже, вам также нужно вызвать IsAdmin в ветке! Verifyuser, чтобы он возвращал правильное представление:

        if (ModelState.IsValid)
        {

            if (LogModel.Login.Verifuser(Model.IDUser, Model.Password))
            {
                FormsAuthentication.SetAuthCookie(Model.IDUser, false);
                if (LogModel.Login.IsAdmin(Model.IDUser, Model.Password))
                {
                    return View("Admin/Index");
                }
                else
                {
                    return View("Agence/Index");
                }
            }
            else
            {
                ModelState.AddModelError("", "Invalide username or Password");

                if (LogModel.Login.IsAdmin(Model.IDUser, Model.Password))
                    return View("Admin/Index", Model);
                else
                    return View("Agence/Index", Model);

            }
        }

В настоящее время вы вызываете return View(Model);, когда у вас есть ошибка ModelState, который возвращает представление по умолчанию для действия, называемого «Логин».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...