如何为指定的控制器分组部分共享视图?

4

有没有可能告诉ViewEngine在指定的控制器中查找其他文件夹中的共享部分视图(而不是其他文件夹)?

我正在使用WebFormViewEngine。

这是目前我的PartialViewLocations的样子。

 public class ViewEngine : WebFormViewEngine
    {
        public ViewEngine()
        {
            PartialViewLocationFormats = PartialViewLocationFormats
                .Union(new[]
                       {
                           "~/Views/{1}/Partial/{0}.ascx",
                           "~/Views/Shared/Partial/{0}.ascx"
                       }).ToArray();
        }
1个回答

2
当涉及到这种情况时,请不要更改PartialViewLocationFormats;相反,请执行以下操作:
    public override ViewEngineResult FindPartialView(
        ControllerContext controllerContext, 
        string partialViewName, 
        bool useCache)
    {
        ViewEngineResult result = null;

        if (controllerContext.Controller.GetType() == typeof(SpecialController))
        {
             result = base.FindPartialView(
                 controllerContext, "Partial/" + partialViewName, useCache);
        }

        //Fall back to default search path if no other view has been selected  
        if (result == null || result.View == null)
        {
            result = base.FindPartialView(
                controllerContext, partialViewName, useCache);
        }

        return result;  
    }

现在只需要使用控制器过滤器进行微调 - 类似于 [AddPartialViewLocation("Shared/SuperFolder")]。你觉得这个想法怎么样 - 是好还是坏? - Arnis Lapsa
我可能会使用 IDictionary<Type, IEnumerable<string>>。然后,您可以获取任意数量的控制器类型要探测的可枚举路径列表。上面的方法将检查当前控制器类型是否在字典中(通过 TryGetValue),然后按顺序探测该类型的路径(如果找到)。 - Craig Stuntz
看起来你同意这不是一个坏主意。感谢提供一些实现的想法。 - Arnis Lapsa
在一定的范围内,这不是一个坏主意。例如,我们为移动电话设备提供特殊视图,但同样的规则适用于所有控制器。然而,如果每个控制器对视图有不同的探测路径,那么对于试图维护您的项目的人来说可能会非常令人困惑。在我们的情况下,我打赌任何看到“Mobile”子文件夹的开发人员都能知道它的作用。因此,请谨慎选择您的规则! - Craig Stuntz
最近 - 在这方面遇到了一些问题。就像其他一些自定义一样。但是毕竟 - 情况并不那么糟糕,我很喜欢它。真的很灵活。 - Arnis Lapsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接