2008-12-15 7 views
5

Tengo un control de usuario fuertemente tipado ("parcial") y me gustaría poder pasarle algo de información adicional de su vista que lo contiene. Por ejemplo, tengo una vista que está vinculada a una clase de producto y tengo una parcial que también está fuertemente tipada a ese mismo modelo, pero también necesito pasar un parámetro adicional para imageSize a mi parcial. Me gustaría ser capaz de hacer algo como esto:¿Cómo se transfiere un bit arbitrario de datos a un control de usuario en ASP.NET MVC utilizando Html.RenderPartial()?

<% Html.RenderPartial("_ProductImage", ViewData.Model, new { imageSize = 100 }); %> 

Por lo que yo sé que no hay manera de hacer esto, pero estoy esperando que alguien más inteligente que yo pueda tener una solución;)

Respuesta

5

cambiar el tipo del modelo parcial:

class PartialModel 
{ 
    public int ImageSize { get; set; } 
    public ParentModelType ParentModel { get; set; } 
} 

Ahora pasarlo:

<% Html.RenderPartial("_ProductImage", 
    new PartialModel() { ImageSize = 100, ParentModel = ViewData.Model }); %> 
2
No

la solución más bella

<% ViewData["imageSize"] = 100; %> 

<% Html.RenderPartial("_ProductImage"); %> 

la ViewData se pasa por defecto

1

utilizo un modelo de clase genérica - que es similar en concepto al enfoque sugerido por Craig.

Ojalá MS cree una sobrecarga en RenderPartial para darnos la misma funcionalidad. Solo un parámetro object data adicional estaría bien.

De todos modos, mi enfoque es crear un modelo parcial que use genéricos para que pueda usarse con todos los controles .ascx.

public class PartialControlModel<T> : ModelBase 
    { 
     public T ParentModel { get; set; } 
     public object Data { get; set; } 

     public PartialControlModel(T parentModel, object data) : base() 
     { 
      ParentModel = parentModel; 
      Data = data; 
     } 
    } 

controlar el Ascx debe heredar de la correcta PartialControlModel si desea que el objeto de ser inflexible, lo que hace más probable es que si has llegado hasta aquí.

public partial class ThumbnailPanel : 
        ViewUserControl<PartialControlModel<GalleryModel>> 

Entonces lo traducen así:

<% Html.RenderPartial("ThumbnailPanel", 
new PartialControlModel<GalleryModel>(ViewData.Model, tag)); %> 

Por supuesto, cuando se hace referencia a ningún artículo en su modelo de los padres debe utilizar la siguiente sintaxis:

ViewData.Model.ParentModel.Images 

, usted puede obtener los datos y echarlo al tipo correcto con:

ViewData.Model.Data 

Si alguien tiene una sugerencia sobre cómo mejorar los genéricos que estoy usando, por favor avíseme.

Cuestiones relacionadas