无法获取部分视图cshtml的ViewModel

时间:2012-06-01 10:01:15

标签: asp.net-mvc asp.net-mvc-3 c#-4.0 razor partial-views

我在索引页面上有一个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。

感谢您的帮助和时间

2 个答案:

答案 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); }

创建模型不是视图的责任,您需要在包含局部视图的视图的关联控制器中实例化它。