分离模型问题

时间:2012-08-07 02:07:04

标签: c# asp.net-mvc-3 separation-of-concerns

我的应用程序中的任何给定模型都可能实现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重载,但这看起来像是一个真正的未经修饰的方法,必须有更好的方法要做到这一点。

0 个答案:

没有答案