2011-12-21 8 views
7

Tengo curiosidad acerca de si el enfoque de usar múltiples parciales fuertemente tipados dentro de un formulario que se devuelva a la vista parcial que contiene es el enfoque correcto de MVC para hacer las cosas . La vista principal está ligado con el modelo siguiente con varias otras propiedades y anotaciones de datos omitidos por razones de brevedad:MVC 3 Razor Form Post w/Multiple Strongly Typed Vistas parciales Sin encuadernación

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; } 
} 

El marcado de los principales Register.cshtml vista no es totalmente abajo, pero esto es cómo se utilizan los parciales a continuación:

@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" /> 
} 

Sólo como referencia la vista parcial de _LoginAccount es a continuación con un exceso de marcado eliminado.

@model Models.Account.UserLogin 

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

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

El problema es en el formulario de mensaje al Registro las propiedades AccountSetup son nulos que se contenía en las parciales. Sin embargo, si agrego los modelos individuales a la firma del método, se llenan. Me doy cuenta de que es porque cuando los campos representan el ID se cambia para que se vean como _LoginId para la vista de registro, por lo que no se correlaciona con el modelo AccountSetup.

no recibe valores de nuevo para accountSetup.UserLogin o accountSetup.SecurityQuestions

[HttpPost] 
    public ActionResult Register(AccountSetup accountSetup) 
    { 

Obtiene valores de nuevo para userLogin y securityQuestions

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

La pregunta es ¿cómo se puede asignar estos de nuevo a la que contiene las propiedades del modelo Views (AccountSetup) sin tener que agregar los modelos de los parciales a la firma del método solo para recuperar los valores? ¿Es este un mal enfoque utilizando vistas parciales fuertemente tipadas dentro de una vista principal?

Respuesta

0

Esto se debe a que sus vistas parciales están fuertemente tipadas. Retirar la declaración @Model en sus Parciales y accede a las propiedades modelo como este

@Html.Partial("_LoginAccount") 

y luego en sus parciales

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

Si hay algo que yo creo que hacer algo, como a continuación sería un enfoque mejor que los cambios sugeridos: @ Html.TextBoxFor (mod => mod.LoginId, nueva {id = "UserLogin_LoginId"}) Si lo hiciera como sugerí que termine haciendo ese parcial específico para las propiedades del modelo fuertemente tipado de la vista principal. ¿Qué pasa si tengo otra vista que quiere usar ese mismo parcial, pero la propiedad UserLogin simplemente se llama LoginCredentials? Luego vuelvo a que es mejor devolverle el marcador a mi vista principal, ya que no está resolviendo mi problema original. – Coderrob

+0

¿Encontró una manera de resolver esto? – Buzzer

0

Todas las vistas parciales deben ser inflexible con el mismo modelo de vista (AccountSetup en su caso):

@model Models.Account.AccountSetup 

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

continuación:

@Html.Partial("_LoginAccount", Model) 
Cuestiones relacionadas