我在索引页面上有一个PartialView,如下所示:-
@{ Html.RenderPartial("ImageUpload"); }
和PartialView看起来像这样:-
@model MvcCommons.ViewModels.ImageModel
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FileName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
</tr>
}
</table>
现在根据PartialView顶部的声明,它应该放在ViewModels.ImageModel中,并且在该类中我有一个构造函数:-
public ImageModel()
{
XDocument imageMetaData = XDocument.Load(uploadsDir + @"/ImagesMetaData.xml");
var images = from image in imageMetaData.Descendants("image")
select new Image(image.Element("filename").Value,
image.Element("description").Value);
this.AddRange(images.ToList<Image>());
}
但是,由于某些原因,在ImageUpload局部视图中,当我调试时,没有将我重定向到此ViewModel构造函数,因此PartialView内部的模型为null。
我在这里想念什么吗?
我如何才能使其真正通过构造函数?我还需要在索引主页面(托管PartialView的页面)中执行@model吗?
感谢您的帮助和时间
最佳答案
@model MvcCommons.ViewModels.ImageModel
行用于声明强类型模型,但不能实例化它。
你应该用
@{ Html.RenderPartial("ImageUpload", <yourmodel>); }
或更简单:
@Html.Partial("ImageUpload", <yourmodel>)
顺便说一句,在您的情况下:
@Html.Partial("ImageUpload", new ImageModel())
但要小心:您的Model应该减少构造函数,而不要加载/解析XML。这应该在控制器中完成(并在缓存系统中设置吗?)。
如果希望减少主视图模型的数量,则还可以创建带有属性ChildActionOnly的Action进行部分渲染,然后使用
@Html.Action(...)
调用它:它创建一个新的ControllerContext。