我在索引页面上有一个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。
感谢您的帮助和时间
答案 0 :(得分:4)
行@model MvcCommons.ViewModels.ImageModel
用于声明强类型模型,但不会实例化它。
你应该使用
@{ Html.RenderPartial("ImageUpload", <yourmodel>); }
或更简单:
@Html.Partial("ImageUpload", <yourmodel>)
顺便说一下,在你的情况下:
@Html.Partial("ImageUpload", new ImageModel())
但请注意:您的Model应该更少构造函数,而不是加载/解析XML。这应该在Controller中完成(并在Caching系统中设置?)。
如果您希望保持主视图模型较少,您还可以使用属性ChildActionOnly为部分渲染创建一个Action,并使用@Html.Action(...)
调用它:它会创建一个新的ControllerContext。
答案 1 :(得分:3)
您没有设置局部视图的模型。见http://msdn.microsoft.com/en-us/library/dd492962.aspx
@{ Html.RenderPartial("ImageUpload", myModel); }
创建模型不是视图的责任,您需要在包含局部视图的视图的关联控制器中实例化它。