Asp.net MVC Razor более одной формы на странице

Yo

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

Вход в систему является частичным просмотром с @model ViewModels.LoginViewModel Регистрация также является частичной с @model ViewModels.RegViewModel

Главная страница, на которой размещены эти фрагменты, представляет собой вид с @model ViewModels.RegPageViewModel.

Эта модель просмотра выглядит так:

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

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

Как обстоят дела с подпредставлениями и их моделью представления? Есть ли стандартный подход к этому?

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

http://monobin.com/__d33cf45a4 — RegisterVm.cs (LoginVm.cs почти такой же)

http://monobin.com/__m69132f76 — RegPageVm.cs

Регистр.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>

_Регистр.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()
}

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


person Community    schedule 21.11.2010    source источник
comment
Можем ли мы увидеть часть кода из представления?   -  person Matthew Abbott    schedule 21.11.2010
comment
разве это не должно быть @Html.Partial(_Register, Model.RegisterVm)?   -  person neebz    schedule 21.11.2010


Ответы (2)


Вы должны убедиться, что элементы формы (например, текстовое поле и т. д.) должны иметь тот же идентификатор, что и свойства RegisterVM и LoginVM. Ваша теория верна, но я думаю, что вы можете ошибиться в соглашении об именах MVC.

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

ИЗМЕНИТЬ:

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

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

person neebz    schedule 21.11.2010
comment
я использую Html.TextBoxFor(x=›x.PropertyName), так что нужно позаботиться об этом, нет? - person ; 21.11.2010
comment
Это должно сработать. Мы снова можем увидеть ваш код; представление, одно из частичных представлений и соответствующая ему модель представления. Может возникнуть проблема с передачей модели в частичное представление. - person neebz; 21.11.2010

Согласно вашему ответу на 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 (чтобы имя поля не создавалось автоматически).

person Gideon    schedule 21.11.2010
comment
Подпредставления имеют @model ViewModels.LoginViewModel и @model ViewModels.RegViewModel соответственно, поэтому они не используют эту нотацию - я предполагаю, что mvc знает, что соответствует иерархии модели представления - или я ошибаюсь? Нужно ли вызывать RenderPartial, указав часть модели представления, которую нужно как-то использовать? - person ; 21.11.2010
comment
Вы проверили HTML, который был создан? (посмотреть источник) - person Gideon; 22.11.2010