How do you pass an arbitrary bit of data to a user control in ASP.NET MVC using Html.RenderPartial()?
我有一个强类型用户控件("部分"),我希望能够从其包含的视图中传递一些附加信息。例如,我有一个视图,它绑定到一个产品类,并且我有一个部分也是强类型到同一个模型,但我还需要将 imageSize 的附加参数传递给我的部分。我希望能够做这样的事情:
1 | <% Html.RenderPartial("_ProductImage", ViewData.Model, new { imageSize = 100 }); %> |
据我所知没有办法做到这一点,但我希望比我更聪明的人可能有解决方案;)
改变局部模型的类型:
1 2 3 4 5 | class PartialModel { public int ImageSize { get; set; } public ParentModelType ParentModel { get; set; } } |
现在通过它:
1 2 | <% Html.RenderPartial("_ProductImage", new PartialModel() { ImageSize = 100, ParentModel = ViewData.Model }); %> |
不是最漂亮的解决方案
1 2 3 | <% ViewData["imageSize"] = 100; %> <% Html.RenderPartial("_ProductImage"); %> |
默认传递ViewData
我使用通用类模型 - 在概念上与 Craig 建议的方法相似。
我有点希望 MS 会为
无论如何,我的方法是创建一个使用泛型的 PartialModel,以便它可以用于所有 .ascx 控件。
1 2 3 4 5 6 7 8 9 10 11 | 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; } } |
如果您希望视图是强类型的,.ascx 控件应该继承自正确的
1 2 | public partial class ThumbnailPanel : ViewUserControl<PartialControlModel<GalleryModel>> |
然后你像这样渲染它:
1 2 | <% Html.RenderPartial("ThumbnailPanel", new PartialControlModel<GalleryModel>(ViewData.Model, tag)); %> |
当然,当您引用任何父模型项时,您必须使用以下语法:
1 | ViewData.Model.ParentModel.Images |
您可以使用 :
获取数据并将其转换为正确的类型
1 | ViewData.Model.Data |
如果有人对如何改进我正在使用的泛型有任何建议,请告诉我。