2011-02-04 14 views
6

tengo todo más la misma pregunta que le ASP.NET MVC partial views: input name prefixesASP.MVC 3 Razor Añadir Modelo Prefijo en la extensión Html.PartialView

Tring para crear operaciones CRUD para este entidades de datos:

public class UserViewModel 
{ 
    protected virtual Id {get; set;} 
    public virtual string Login { get; set; } 
    public virtual string Password { get; set; } 
    public virtual ZipCodeViewModel ZipCode { get; set; } 
} 

entidad código postal:

public class ZipCodeViewModel 
{   
    public virtual string City { get; set; } 

    public virtual string State { get; set; }   

    public virtual string Zip { get; set; } 
} 

que también tienen vista parcial que utiliza ZipCode UserViewModel.ZipCode:

@model ZipCodeViewModel  

    @Html.TextBoxFor(x => x.Zip, new { id = "ZipCode", name = "ZipCode.Zip", maxlength = "5" })  

voy a utilizar ZipCodePartialView en otra página (por ejemplo, usuario).

@model UserViewModel 
..... 
@{Html.RenderPartial("Zipcode", Model.ZipCode);} 

When MVC save User ZipCode field Zip is empty.

Así que la pregunta es cómo puedo añadir modelo prefijo al Ver patrial?

+0

¿Cómo cargas tu objeto? ¿Está usted ISession abierto? ¿Usas carga lenta? – Nekresh

+1

¿Está diciendo que los datos de ZipCode nunca llegan a la página representada? ¿O está diciendo que cuando vuelve a publicar los datos, nunca se ingresan los datos en el modelo? –

+0

Publicar datos de respaldo siempre nulos. –

Respuesta

11

Pruebe esta extensión:

public static void RenderPartialWithPrefix(this HtmlHelper helper, string partialViewName, object model, string prefix) 
     { 
      helper.RenderPartial(partialViewName, 
           model, 
           new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = prefix } }); 
     } 
+0

Es exactamente lo que necesito –

10

En lugar de usar Html.RenderPartial() ponga su vista parcial en Shared/EditorTemplates/y asígnele el nombre del tipo (en este caso ZipCodeViewModel). Luego puede usar Html.EditorFor() pasando la expresión de la propiedad. EditorFor() hace un prefijo de los campos correctamente para que el archivador modelo en MVC pueda colocar correctamente sus datos.

Así que algo como esto

@model UserViewModel 
..... 
@Html.EditorFor(m => m.ZipCode); 

Voy a tratar de desenterrar algunos enlaces y recursos, pero quería obtener la respuesta por ahí para ti.

EDITAR: Este blog parece ir sobre los fundamentos de la EditorFor() extensión y EditorTempaltes: Quick Tips About ASP.NET MVC: Editor Tempaltes

De todos modos, cuando se utiliza esas Html.TextBoxFor() o Html.DropDownFor() extensiones, lo que hacen es obtener el nombre completo de la propiedad de la expresión que ingresa y establece el nombre del elemento de entrada HTML y los atributos de id para eso. Ejemplo podría ser:

@Html.TextBoxFor(m => m.Person.FirstName) 

haría

<input id="Person_FirstName" name="Person.FirstName" type="text" value="<what ever was in FirstName>" /> 

Aquellos nombres de entrada y los valores son los pares clave/valor de los datos de correos. El aglutinante modelo de ASP.NET MVC por defecto intenta hacer coincidir esas llaves hasta los modelos de sus acciones del controlador toman en. Si se puede encontrar una coincidencia entonces se establece el valor.

Así que su problema anterior es probablemente porque los nombres de entrada en su vista parcial son del ZipCodeViewModel hacia abajo, pero su acción está tomando en un UserViewModel. Los prefijos EditorFor() los nombres para que por lo que, básicamente, puede hacer que una vista parcial que parte posterior del poste de datos que se puede unir para usted. Aunque puede establecer los atributos de nombre usted mismo en los elementos de entrada (o aplanar todo como sugirió en los comentarios) tiene estos ayudantes para hacerlo por usted.

espero que ayuda a explicar lo que está sucediendo y una posible solución para usted.

+0

Puedo simplemente agregar campos de mi modelo de ZipCode al modelo de usuario y todo funciona. Pero luego tengo que crear la vista ZipCode en la Vista. No es una buena implementación del MVC. Y voy a obtener algo como UserControl, que puedo usar en los diversos lugares de mi programa. –

+0

Recomendaría no saturar su modelo de Usuario si no lo necesita/desea y el Ayudante de EditorFor() con el EditorTemplates crea una vista parcial reutilizable. Creo que esto es lo que buscas. –

+0

Tienes razón. Es el awser. –

-1

Puede el siguiente código:

ActionResult MyAction(UserViewModel model) 
{ 
    TryUpdateModel(model.ZipCode); 
} 

Así modelo bien actualizarse dos veces. Segunda vez para su parcial.

Cuestiones relacionadas