À la fois le login et le formulaire d'inscription sur un point de vue MVC3 Rasoir
Ma tâche est de créer à la fois le login et le formulaire d'inscription sur une vue!
J'ai la vue d'accueil. D'une maison, la vue que j'ai deux formes, connexion et inscription. Ils ont rendu par @Html.RenderPartial(vue partielle nom, le modèle). Que les formes se rapporte à Compte contrôleur (le Login et le Registre des actions).
Permettez-moi d'abord de vous fournir avec un peu de code...
Modèles:
//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; }
}
Vues:
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
}
...
Contrôleurs:
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);
}
}
Juste vous montrer action Login de Compte contrôleur
//
//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);
}
Si tout fonctionne bien, MAIS! Lorsque le modèle de l'état n'est pas valide j'ai exception suivante
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'.
Je peux lier que des vues partielles et compte des mesures de modèle à la Maison, mais ce n'est pas ce dont j'ai besoin.
J'ai planification de l'utilisation de _LoginArea.cshtml vue dans d'autres points de vue (par exemple dans un en-tête de page de ‘Utilisateur’ vue, et de ce point de vue a un autre modèle)
Donc, j'ai besoin de la méthode d'action (par exemple, Connexion) pour récupérer modèle de Connexion, pas de Maison ou tout autre chose. Mais dans ce cas je ne suis pas en mesure de retourner le modèle de la vue d'Accueil.
Comment puis-je résoudre ce problème? Ce est une meilleure façon?
Désolé pour beaucoup de code, je veux juste clarifier les choses.
OriginalL'auteur Nazar Grynko | 2011-05-08
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, je recommande d'avoir une connexion centrale/page d'inscription où les utilisateurs seront redirigés vers lors de la validation de échoue. Pour les fins de l'exemple, disons que c'est une vue nommée
SiteAuthenticate
Ainsi, dans le cas de votre
LogIn(Login model)
action, si la validation échoue, vous ramenez toujours laSiteAuthenticate
point de vue qui serait fortement typé pour inclure leLogin
etRegister
modèles, très similaire à la votreHome
modèle.Que les dernières captures de faire de cette approche de travail serait d'ajouter un
ReturnUrl
propriété à votreLogin
etRegister
modèles. Ce peut être rempli toutefois vous le souhaitez, ou en utilisant quelque chose commeRequest.UrlReferrer
. De cette façon, vous saurez à envoyer à l'utilisateur de retourner à quand elles finissent par se connecter/s'inscrire avec succès.Ainsi, quand tout est dit et fait, votre
LogIn
action pourrait ressembler à quelque chose comme ceci:Votre
SiteAuthenticate
serait aussi puis après, à la mêmeLogin
action. Depuis que vous avez transmis l'original RetunrUrl, si la connexion est alors réussie, l'utilisation sera redirigé vers leur destination initiale comme prévu.Espère que ça aide, laissez-moi savoir si quelque chose n'est pas clair ou ne fait pas de sens.
OriginalL'auteur ataddeini
RÉSOLU!!! Utilisé Html.RenderAction à la place.
Voici le code:
Index.cshtml
Vues partielles sont les mêmes...
Contrôleur:
Même choses pour le Registre des actions.
Comme vous pouvez le voir, je suis en utilisant TempData de modèle de magasin d'état, puis de les récupérer lors de l'action est de commencer à rendre.
Autre question est de savoir comment nous pouvons savoir d'où l'on devrait revenir si le modèle de l'état n'est pas valide. Ma solution est d'analyser Demande.UrlReferrer, comme ataddeini dit.
Grand merci à mon ami Danylchuk Yaroslav pour lui venir en aide!
OriginalL'auteur Nazar Grynko