我的应用程序中的任何给定模型都可能实现IHasOpenGraphMetadata
,如果是这种情况,我的布局中对@Html.Partial("_OpenGraphMetadata")
的调用将通过该接口访问模型来呈现相关元数据。
一切都很好,干净。直到我想从部分行动中做到这一点。
在/Home/Index
我有以下电话:@Html.Action("List", "Posts")
返回:
public ActionResult List(long? timestamp = null, int count = 8)
{
IEnumerable<Post> posts = postService.GetLatest(timestamp, count);
PostListModel model = mapper.Map<IEnumerable<Post>, PostListModel>(posts);
return PartialView(model);
}
此问题在此处变得明显:/Home/Index
的实际模型为null
,而实际元数据位于/Posts/List
局部视图结果中
我在我的部分中使用了这个,它呈现了og:data
("_OpenGraphMetadata"
):
@{
OpenGraphModel openGraph = GetOpenGraphMetadata();
if (openGraph != null)
{
@OpenGraphMetaProperty("title", openGraph.Title)
@OpenGraphMetaProperty("description", openGraph.Description)
@OpenGraphMetaProperty("url", openGraph.Url)
@OpenGraphMetaProperty("image", openGraph.Image)
}
}
@helper OpenGraphMetaProperty(string property, string value)
{
if (!value.NullOrBlank())
{
<meta property="og:@property" content="@value" />
}
}
@functions
{
private OpenGraphModel GetOpenGraphMetadata()
{
IHasOpenGraphMetadata model = Model as IHasOpenGraphMetadata;
if (model != null)
{
return model.OpenGraph;
}
return Context.Items[Constants.OpenGraphContextItem] as OpenGraphModel;
}
}
我觉得这很不错,尝试从实际模型中提取元数据,如果没有实现接口,则访问HttpContext
并在那里查找元数据。现在的问题是,我应该如何将这些元数据放在HttpContext
?
我真的不想用以下调用来污染我的动作方法:
HttpContext.Items[Constants.OpenGraphContextItem] = model.OpenGraph;
但我还有其他选择吗?我应该在全局动作过滤器中执行此操作吗?结果过滤器?这些选项有替代方案吗?
更新
在动作过滤器中似乎不可能这样做,我想通过我可以这样做的方式是覆盖基本控制器的PartialView,以及两个View重载,但这看起来像是一个真正的未经修饰的方法,必须有更好的方法要做到这一点。