我不确定我在这里做错了什么。我没有使用我正在使用的模型的默认显示模板。
此代码位于我的主要操作视图中:
@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
时指定了模型类型名称,它仍然无效。
这里证明了正确命名的显示模板局部视图已经到位。
我做错了什么?
答案 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