Моя задача - создать форму входа и регистрации в одном окне!
У меня есть вид из дома. На домашнем экране у меня есть две формы, войти и зарегистрироваться. Они отображаются с помощью @ Html.RenderPartial (частичное имя, модель). Эта форма относится к контроллеру аккаунта (действия входа и регистрации).
Позвольте мне сначала предоставить вам некоторый код ...
Модель
// Login model, that contains email and password
public class Login
{
…
}
// Registration model that contains minimum user data, e.g. name, surname
public class Register
{
...
}
// Model for home view which contains models for both register and login
public class Home
{
public Login LoginModel { get; set; }
public Register RegisterModel { get; set; }
}
Просмотры :
Index.cshtml
@model App.Models.Home.Home
<!-- Login Box -->
@{ Html.RenderPartial("_LoginArea", Model.LoginModel); }
<!-- Register Box -->
@{ Html.RenderPartial("_RegisterArea", Model.RegisterModel); }
_LoginArea.cshtml
@model App.Models.Account.Login
<div style="float: left; margin-right: 100px;">
<h1>@Localization.Account.Login</h1>
<!-- Login form -->
<div id="loginBox">
@using (Html.BeginForm("Login", "Account", FormMethod.Post))
{
<div class="editor-label">
@Html.LabelFor(m => m.Email):
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Password):
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<div class="editor-label">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>
<p>
<input type="submit" value="@Localization.Account.Login" />
</p>
}
</div>
</div>
_RegisterArea.cshtml
@model App.Models.Account.Register
<div style="vertical-align: bottom;">
<h1>@Localization.Account.Register</h1>
<div>
@using (Html.BeginForm("Register", "Account"))
{
//same things like in login
}
...
Контроллеры:
HomeController
//
// GET: /Home/
public ActionResult Index(Home model)
{
//
// If logedin redirect to profile page
// Else show home page view
//
if (Request.IsAuthenticated)
{
return RedirectToAction("Index", "User", new { id = HttpContext.User.Identity.Name });
}
else
{
model.LoginModel = new Login();
model.RegisterModel = new Register();
return View(model);
}
}
Просто покажите действие входа из контроллера аккаунта
//
// POST: /Account/Login
[HttpPost]
public ActionResult LogIn(Login model)
{
if (Request.IsAuthenticated)
{
return RedirectToAction("Index", "User", new { id = HttpContext.User.Identity.Name });
}
else
{
if (ModelState.IsValid)
{
if (model.ProcessLogin())
{
return RedirectToAction("Index", "User", new { id = HttpContext.Session["id"] });
}
}
}
//Note: this is problem part
// If we got this far, something failed, redisplay form
return View("~/Views/Home/Index.cshtml", model);
}
Так что все отлично работает, НО ! Когда состояние модели недействительно, у меня есть следующее исключение
The model item passed into the dictionary is of type 'App.Models.Account.Login', but this dictionary requires a model item of type App.Models.Home.Home'.
Я могу связать эти частичные виды и действия учетной записи с моделью Home, но это не то, что мне нужно.
Я планирую использовать представление _LoginArea.cshtml в других представлениях (например, в заголовке страницы представления «Пользователь», и это представление имеет другую модель)
Итак, мне нужен метод действия (например, Login) для получения модели Login, а не Home или чего-либо еще. Но в этом случае я не могу вернуть модель в начальный вид.
Как я могу решить эту проблему? Что является лучшим правильным способом?
Извините за большое количество кода, просто хочу ясных вещей.