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

10-04 15:37