ASP.NET MVC未找到显示模板局部视图

时间:2014-04-24 14:50:05

标签: c# asp.net-mvc asp.net-mvc-5

我不确定我在这里做错了什么。我没有使用我正在使用的模型的默认显示模板。

此代码位于我的主要操作视图中:

@if (Model.EmbeddedMediaModels != null)
{
    foreach (var mediaItem in Model.EmbeddedMediaModels)
    {
        BitmapFigureModel bitmap = mediaItem as BitmapFigureModel;
        if (bitmap != null)
        {
            var mm = ModelMetadata.FromLambdaExpression(p => bitmap, this.ViewData);

            var modelTypeName = mm.ModelType.Name; // = "BitmapFigureModel"

            // Neither resolve the template.

            // Html.DisplayFor(m => bitmap);
            Html.DisplayFor(m => bitmap, modelTypeName);
        }
    }
}

Model.EmbeddedMediaModels属性是EmbeddedMediaModel基类型的集合,目前它只包含一个对象,BitmapFigureModel派生自EmbeddedMediaModel

很容易认为这是令人困惑的问题,但检索到的ModelMetadata实例非常能够看到正确的BitmapFigureModel模型类型。

此外,即使我在调用DisplayFor时指定了模型类型名称,它仍然无效。

这里证明了正确命名的显示模板局部视图已经到位。

enter image description here

我做错了什么?

2 个答案:

答案 0 :(得分:2)

与Brad Wilson(ASP.NET团队)的建议相反:

  

基于表达式的版本主要用于提取值   来自模型(它们由当前模型参数化,如图所示   在上面的例子中)。它们也可用于从中提取值   除了模型或ViewData之外的一些来源(例如,带有   表达式如“model => someOtherValue“忽略了模型   完全)。这使它们在循环中很有用。

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

实际上似乎不可能“完全忽略模型”。在我的问题评论中,DaveParsons建议通过新建模型实例并将其传递到DisplayFor来进行实验,这会导致错误:

  

模板只能用于字段访问,属性访问,   单维数组索引或单参数自定义索引器   表达式。

所以看来我应该不再是一个聪明的裤子而只是像Ehsan Sajjad所说的那样使用Html.Partial

答案 1 :(得分:1)

这样做:

@Html.DisplayFor(m => mediaItem.Name)

如果要加载局部视图:

@Html.Partial("~/Views/Shared/DisplayTemplates/BitmapFigureModel.cshtml", mediaItem)

或:

@Html.RenderPartial("~/Views/Shared/DisplayTemplates/BitmapFigureModel.cshtml", mediaItem)

BitmapFigureModel.cshtml

@model BitmapFigureModel