À 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