Сообщение формы бритвы MVC 3 с несколькими типизированными частичными представлениями без привязки - PullRequest
7 голосов
/ 21 декабря 2011

Мне любопытно, является ли подход использования нескольких строго типизированных частичек в форме, которая возвращает обратно в частичное содержащее представление, правильным подходом MVC для выполнения задач. Основное представление связано со следующей моделью, в которой для краткости опущены некоторые другие свойства и аннотации данных:

public class AccountSetup : ViewModelBase
{
    public bool TermsAccepted { get; set; }
    public UserLogin UserLogin { get; set; }
    public SecurityQuestions SecurityQuestions { get; set; }
}

public class UserLogin
{
    public string LoginId { get; set; }
    public string Password { get; set; }
}

Разметка основного окна Register.cshtml не полностью показана ниже, но вот как используются партиалы ниже:

@model Models.Account.AccountSetup

. . . <pretty markup> . . . 

@using (Html.BeginForm("Register", "Account", FormMethod.Post))
{ 
     . . . <other fields and pretty markup> . . . 

     @Html.Partial("_LoginAccount", Model.UserLogin)
     @Html.Partial("_SecurityQuestions", Model.SecurityQuestions)

     <input id="btnContinue" type="image" />
}

Только для справки ниже приведено частичное представление _LoginAccount с удаленной избыточной разметкой.

@model Models.Account.UserLogin

<div>
     @Html.TextBoxFor(mod => mod.LoginId)

     @Html.PasswordFor(mod => mod.Password)
</div>

Проблема заключается в отправке формы в регистр. Свойства AccountSetup имеют нулевое значение, которые содержались в партиалах. Однако, если я добавлю отдельные модели в сигнатуру метода, они будут заполнены. Я понимаю, что это потому, что когда визуализация полей ID изменяется, они выглядят как _LoginId для представления реестра, поэтому он не сопоставляется с моделью AccountSetup.

Не возвращает значения для accountSetup.UserLogin или accountSetup.SecurityQuestions

    [HttpPost]
    public ActionResult Register(AccountSetup accountSetup)
    {

Возвращает значения для userLogin и securityQuestions

    [HttpPost]
    public ActionResult Register(AccountSetup accountSetup, UserLogin userLogin, SecurityQuestions securityQuestions)
    {

Вопрос в том, как можно сопоставить их со свойствами модели Views (AccountSetup), не добавляя модели партиала к сигнатуре метода только для того, чтобы получить значения обратно? Это плохой подход с использованием строго типизированных частичных представлений в главном представлении?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2015

Все частичные представления должны строго печататься с использованием одной и той же модели представления (AccountSetup в вашем случае):

@model Models.Account.AccountSetup

@Html.TextBoxFor(mod => mod.UserLogin.LoginId)
@Html.PasswordFor(mod => mod.UserLogin.Password)

Тогда:

@Html.Partial("_LoginAccount", Model)
0 голосов
/ 22 декабря 2011

Это потому, что ваши частичные представления строго типизированы.Удалите объявление @model в ваших Partials и получите доступ к свойствам модели, таким как

@Html.Partial("_LoginAccount")

, а затем в вашем частичном

<div>
     @Html.TextBoxFor(mod => mod.UserLogin.LoginId)
     @Html.PasswordFor(mod => mod.UserLogin.Password)
</div>
...