ASP.NET MVC Razor Более одной формы на странице
-
26-09-2019 - |
Вопрос
Эй
У меня есть регистрационная страница на моем сайте - в верхней части страницы - это форма входа в систему для существующих пользователей. В главной области есть регистрационная форма.
Логин - это частичный вид с @model ViewModels.LoginViewModel
Регистрация также является частичной с @model ViewModels.RegViewModel
Главная страница, в которой дома эти частицы - это вид с @model ViewModels.RegPageViewModel
Этот ViewModel выглядит как:
public class RegViewModel
{
public RegisterVm RegisterVm { get; set; }
public LoginVm LoginVm { get; set; }
}
Когда я отправляю регистрационную часть страницы (это действие - это регистрация / захват - приемное действие ожидает, что регистрация регистрации) к его контроллеру он жалуется на передачу неправильного ViewModel
Что такое сделка с субвезонными и их просмотраModel? Есть ли стандартный подход к борьбе с этим?
Должен ли я иметь один изменить URL для этой страницы, которая выходит из строя, если это запрос входа в систему или запрос в регистр, а затем обрабатывает сообщение Соответственно? Это кажется грязным для меня, хотя ...
http://monobin.com/__d33cf45a4. - RegistervM.cs (loginvm.cs в значительной степени такой же, как этот)
http://monobin.com/__m69132f76. - RegPageVM.cs.
Register.cshtml:
@model xxxx.ViewModels.RegPageVm
@{
View.Title = "Register";
Layout = "~/Views/Shared/_BareBones.cshtml";
}
<link rel="stylesheet" href="@Url.Content("~/Public/Css/signup.css")" type="text/css" />
<div id="sign-up-container">
<div id="sign-up-box">
<div id="sign-up-box-left">
<img src="@Url.Content("~/Public/Images/Signup_176x81.png")" />
</div>
<div id="sign-up-box-right">
@Html.Partial("_Register")
</div>
</div>
</div>
<div class="clear">
</div>
_Register.cshtml:
@model xxxx.ViewModels.RegisterVm
@using (Html.BeginForm("Capture", "Register", FormMethod.Post))
{
<table class="sign-up-box-inner">
<tr>
<td class="label-area">
@Html.LabelFor(x => x.Email)
</td>
<td class="field-area">
@Html.TextBoxFor(x => x.Email, new { @class = "login-input", title = "Enter Name" })
</td>
</tr>
<tr>
<td class="label-area">
@Html.LabelFor(x => x.Password)
</td>
<td class="field-area">
@Html.PasswordFor(x => x.Password, new { @class = "login-input", title = "Enter Name" })
</td>
</tr>
<tr>
<td class="label-area">
@Html.LabelFor(x => x.UserName)
</td>
<td class="field-area">
@Html.TextBoxFor(x => x.UserName, new { @class = "login-input", title = "Enter Name" })
</td>
</tr>
<tr>
<td colspan="2">
<input type="image" src="../../Public/Images/Submit_150x47.png" class="submit-button" />
</td>
</tr>
</table>
@Html.AntiForgeryToken()
}
И, наконец, RecisterController.cs:
public class RegisterController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Capture(RegisterVm registerVm)
{
if (!ModelState.IsValid)
{
return View("index", new RegPageVm()
{
LoginVm = new LoginVm(),
RegisterVm = registerVm
});
}
return RedirectToAction("index", "Event");
}
}
W: //
Решение
Вам необходимо убедиться, что элементы формы (например, TextBox etc) должны иметь тот же идентификатор, что и свойства Registervm и Properties. Ваша теория права, но я думаю, что вы можете допустить ошибку в Конвенции именования MVC.
Если вы можете поделиться своим кодом представления + классы VM, мы сможем помочь лучше.
РЕДАКТИРОВАТЬ:
Глядя на ваш код, я думаю, вы должны проходить модель просмотра на ваш частичный вид. Как например, следующая линия верит, должна быть такой>
@Html.Partial("_Register", Model.RegisterVm)
Другие советы
Согласно вашему ответу на Neebz:
Ты используешь:
Html.TextBoxFor(x=>x.LoginVM.Email) // i guess
Это превратится в <input name="LoginVM.Email" ...>
Обратите внимание LoginVM.
часть
Ваше действие входа, вероятно, выглядит:
public ActionResult Login(LoginVM model) { }
Итак, оно ожидает, что имена поля, как Email
а также Password
, нет LoginVM.Email
а также LoginVM.Password
.
Так что вы могли бы использовать Html.Textbox
вместо этого (так что имя поля не становится автокреэтом).