Pregunta

Yo

Tengo una página de registro en mi sitio - en la parte superior de la página es un formulario de acceso para los usuarios existentes. En el área principal se encuentra el formulario de registro.

El inicio de sesión son es una vista parcial con @model ViewModels.LoginViewModel El registro son también una parcial con @model ViewModels.RegViewModel

La página principal que alberga estos parciales es una vista con @model ViewModels.RegPageViewModel

Este ViewModel se ve así:

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

Cuando envío la parte de registro de la página (que es de acción registro / captura - la acción de recepción espera un RegisterVm) a la misma de controlador que se queja de haber sido aprobado el modelo de vista equivocado

¿Cuál es el trato con subvistas y su modelo de vista? ¿Hay un método estándar para tratar con esto?

¿Debo tener una dirección URL para enviar esta página, que se da cuenta de si se trata de una solicitud de inicio de sesión o una solicitud de registro y luego se encarga de la entrada en consecuencia? Eso parece un poco incómodo de mí, sin embargo ...

http://monobin.com/__d33cf45a4 - RegisterVm.cs (LoginVm.cs es más o menos la misma como este)

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

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

¿Fue útil?

Solución

Usted necesita asegurarse de que los elementos de formulario (como el cuadro de texto, etc.) deben tener el mismo ID que las propiedades RegisterVM y LoginVM. Su teoría es correcta, pero creo que podría estar cometiendo un error en la convención de nomenclatura de la MVC.

Si usted puede compartir su código de la vista + las clases de máquinas virtuales, a continuación, vamos a ser capaces de ayudar a una mejor.

EDIT:

En cuanto a su código creo que debería estar pasando el modelo de vista a su vista parcial. Como por ejemplo, la siguiente línea considera que debería estar como esto>

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

Otros consejos

De acuerdo con su respuesta a nEEbz:

Está utilizando:

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

esto se convertiría en <input name="LoginVM.Email" ...>

Aviso la parte LoginVM.

Su acción login probablemente será similar a:

public ActionResult Login(LoginVM model) { }

por lo que esperan que los nombres de campo como Email y Password, no LoginVM.Email y LoginVM.Password.

Por lo que podría podría utilizar en lugar Html.Textbox (de modo que el nombre del campo no recibe autocreated).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top