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

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top