Вопрос

Эй

У меня есть регистрационная страница на моем сайте - в верхней части страницы - это форма входа в систему для существующих пользователей. В главной области есть регистрационная форма.

Логин - это частичный вид с @model ViewModels.LoginViewModelРегистрация также является частичной с @model ViewModels.RegViewModel

Главная страница, в которой дома эти частицы - это вид с @model ViewModels.RegPageViewModel

Этот ViewModel выглядит как:

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

Когда я отправляю регистрационную часть страницы (это действие - это регистрация / захват - приемное действие ожидает, что регистрация регистрации) к его контроллеру он жалуется на передачу неправильного ViewModel

Что такое сделка с субвезонными и их просмотраModel? Есть ли стандартный подход к борьбе с этим?

Должен ли я иметь один изменить URL для этой страницы, которая выходит из строя, если это запрос входа в систему или запрос в регистр, а затем обрабатывает сообщение Соответственно? Это кажется грязным для меня, хотя ...

http://monobin.com/__d33cf45a4. - RegistervM.cs (loginvm.cs в значительной степени такой же, как этот)

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

И, наконец, RecisterController.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: //

Это было полезно?

Решение

Вам необходимо убедиться, что элементы формы (например, TextBox etc) должны иметь тот же идентификатор, что и свойства Registervm и Properties. Ваша теория права, но я думаю, что вы можете допустить ошибку в Конвенции именования MVC.

Если вы можете поделиться своим кодом представления + классы VM, мы сможем помочь лучше.

РЕДАКТИРОВАТЬ:

Глядя на ваш код, я думаю, вы должны проходить модель просмотра на ваш частичный вид. Как например, следующая линия верит, должна быть такой>

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

Другие советы

Согласно вашему ответу на Neebz:

Ты используешь:

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

Это превратится в <input name="LoginVM.Email" ...>

Обратите внимание LoginVM. часть

Ваше действие входа, вероятно, выглядит:

public ActionResult Login(LoginVM model) { }

Итак, оно ожидает, что имена поля, как Email а также Password, нет LoginVM.Email а также LoginVM.Password.

Так что вы могли бы использовать Html.Textbox вместо этого (так что имя поля не становится автокреэтом).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top