Question

Yo

J'ai une page d'inscription sur mon site - en haut de la page est un formulaire de connexion pour les utilisateurs existants. Dans la zone principale, il y a le formulaire d'inscription.

La connexion est une vue partielle avec @model ViewModels.LoginViewModel L'enregistrement sont également une partie de @model ViewModels.RegViewModel

La page principale qui abrite ces Partials est une vue avec @model ViewModels.RegPageViewModel

ressemble ViewModel comme:

public class RegViewModel
{
    public RegisterVm RegisterVm { get; set; }
    public LoginVm LoginVm { get; set; }
}

Quand je soumets la partie d'enregistrement de la page (il est l'action est registre / capture - l'action de réception attend un RegisterVm) au contrôleur de ce qu'il se plaint d'être passé le mauvais viewmodel

Quelle est l'affaire avec des sous-vues et leur viewmodel? Y at-il une approche standard pour y faire face?

que je devrais faire une URL pour soumettre cette page qui figure si elle est une demande de connexion ou d'une demande de registre et les poignées puis le poste en conséquence? Cela semble compliqué pour moi si ...

http://monobin.com/__d33cf45a4 - RegisterVm.cs (LoginVm.cs est à peu près la même comme cela)

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()
}

Et enfin 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: //

Était-ce utile?

La solution

Vous devez vous assurer que les éléments de forme (comme la zone de texte, etc.) doivent avoir le même identifiant que les propriétés RegisterVM et LoginVM. Votre théorie est juste, mais je pense que vous pourriez faire une erreur dans la convention de nommage de MVC.

Si vous pouvez partager votre code de vue + classes VM, alors nous serons en mesure d'aider à mieux.

EDIT:

En regardant votre code, je pense que vous devriez passer le modèle de vue de votre vue partielle. Comme par exemple la ligne suivante, devraient être comme celui-ci>

@Html.Partial("_Register", Model.RegisterVm)

Autres conseils

Selon votre réponse à nEEbz:

Vous utilisez:

Html.TextBoxFor(x=>x.LoginVM.Email) // i guess

se transformerait en <input name="LoginVM.Email" ...>

Notez la partie LoginVM.

Votre action de connexion ressemble probablement:

public ActionResult Login(LoginVM model) { }

il attendre les noms des champs comme Email et Password, pas LoginVM.Email et LoginVM.Password.

Vous pouvez pouvez utiliser à la place Html.Textbox (de sorte que le nom du champ ne soit pas autocreated).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top