Сообщение формы бритвы MVC 3 с несколькими строго типизированными частичными представлениями, не связывающими
Мне любопытно, является ли подход использования нескольких строго типизированных частичек в форме, которая возвращает обратно к частичному, содержащему представление, правильным подходом 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 имеют нулевое значение, которые содержались в частичных размерах. Однако, если я добавлю отдельные модели в сигнатуру метода, они будут заполнены. Я понимаю, что это происходит потому, что при отображении полей идентификатор изменяется так, что они выглядят как _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 ответа
Все частичные представления должны быть строго типизированы с использованием одной и той же модели представления (AccountSetup в вашем случае):
@model Models.Account.AccountSetup
@Html.TextBoxFor(mod => mod.UserLogin.LoginId)
@Html.PasswordFor(mod => mod.UserLogin.Password)
Затем:
@Html.Partial("_LoginAccount", Model)
Это потому, что ваши частичные представления строго типизированы. Удалите объявление @model в ваших Partials и получите доступ к таким свойствам модели, как это
@Html.Partial("_LoginAccount")
а затем в вашем частичном
<div>
@Html.TextBoxFor(mod => mod.UserLogin.LoginId)
@Html.PasswordFor(mod => mod.UserLogin.Password)
</div>