3

我在索引页面上有一个 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 中的模型为空。

我在这里错过了什么吗?

我怎样才能让它真正通过我的构造函数?我是否还需要在主索引页面(托管 PartialView 的位置)中做一个@model。

感谢您的帮助和时间

4

2 回答 2

4

该行@model MvcCommons.ViewModels.ImageModel用于声明强类型模型,但不实例化它。

你应该使用

@{ Html.RenderPartial("ImageUpload", <yourmodel>); }

或更简单:

@Html.Partial("ImageUpload", <yourmodel>)

顺便说一句,在你的情况下:

@Html.Partial("ImageUpload", new ImageModel())

但要小心:您的模型应该是更少的构造函数,而不是加载/解析 XML。这应该在控制器中完成(并在缓存系统中设置?)。

如果您希望减少主视图模型,您还可以使用属性 ChildActionOnly 创建一个动作以进行部分渲染,并使用以下命令调用它@Html.Action(...):它会创建一个新的 ControllerContext。

于 2012-06-01T10:22:41.400 回答
3

您没有设置局部视图的模型。请参阅http://msdn.microsoft.com/en-us/library/dd492962.aspx

@{ Html.RenderPartial("ImageUpload", myModel); }

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

于 2012-06-01T10:07:58.560 回答