Asp.net MVC Razor più di una forma in una pagina
-
26-09-2019 - |
Domanda
Yo
Ho una pagina di registrazione sul mio sito - nella parte superiore della pagina è una forma di accesso per gli utenti esistenti. Nella zona principale si trova il modulo di registrazione.
L'accesso è è una vista parziale con @model ViewModels.LoginViewModel
La registrazione sono anche un parziale @model ViewModels.RegViewModel
La pagina principale, che ospita questi parziali è una vista con @model ViewModels.RegPageViewModel
Questa ViewModel appare come segue:
public class RegViewModel
{
public RegisterVm RegisterVm { get; set; }
public LoginVm LoginVm { get; set; }
}
Quando presento la parte di registrazione della pagina (che di azione è il registro / capture - l'azione di ricezione si aspetta un RegisterVm) al controllore di essa la si lamenta di essere passati dalla parte del torto ViewModel
Qual è il problema con subviews e la loro ViewModel? Esiste un approccio standard per trattare con questo?
Dovrei avere uno presentare URL per questa pagina che capisce se si tratta di una richiesta di accesso o di una richiesta di registro e quindi gestisce la posta di conseguenza? Che sembra disordinato a me, però ...
http://monobin.com/__d33cf45a4 - RegisterVm.cs (LoginVm.cs è praticamente la stessa come questo)
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()
}
E infine RegisterController.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: //
Soluzione
È necessario garantire che gli elementi del modulo (come la casella di testo, ecc) dovrebbero avere lo stesso ID come le proprietà RegisterVM e LoginVM. La vostra teoria è giusta, ma penso che si potrebbe essere fare un errore nella convenzione di denominazione di MVC.
Se è possibile condividere il codice della vista + le classi di macchine virtuali, allora saremo in grado di aiutare meglio.
Modifica
Guardando il codice penso che si dovrebbe essere di passaggio del modello al fine di vostra visione parziale. Come per esempio la seguente riga crede dovrebbe essere come questo>
@Html.Partial("_Register", Model.RegisterVm)
Altri suggerimenti
Secondo la vostra risposta a nEEbz:
Si utilizza:
Html.TextBoxFor(x=>x.LoginVM.Email) // i guess
questo si trasformerebbe in <input name="LoginVM.Email" ...>
Si noti la parte LoginVM.
La vostra azione di login probabilmente appare come:
public ActionResult Login(LoginVM model) { }
in modo che si aspettano i nomi dei campi come Email
e Password
, non LoginVM.Email
e LoginVM.Password
.
Così si potrebbe potrebbe usare Html.Textbox
invece (in modo che il nome del campo non ottiene autocreated).