【问题标题】:MVC 4 View engine search locationsMVC 4 查看引擎搜索位置
【发布时间】:2014-10-07 08:51:38
【问题描述】:

我已经在这篇文章的底部实现了 mcfea 答案,但它不起作用。

Adding sub-directory to "View/Shared" folder in ASP.Net MVC and calling the view

我在 Views/Shared 下有一个名为 Timesheet 的子文件夹。

这是个例外。

未找到视图“时间表”或其主视图或没有视图引擎 支持搜索的位置。以下位置是 搜索:~/Views/Home/Timesheet.aspx ~/Views/Home/Timesheet.ascx ~/Views/Shared/Timesheet.aspx ~/Views/Shared/Timesheet.ascx ~/Views/Home/Timesheet.cshtml ~/Views/Home/Timesheet.vbhtml ~/Views/Shared/Timesheet.cshtml ~/Views/Shared/Timesheet.vbhtml

马尔科姆

public class MylesterViewEngine : RazorViewEngine
{
    private static readonly string[] NewPartialViewFormats =
{
    "~/Views/{1}/Timesheet/{0}.cshtml",
    "~/Views/Shared/Timesheet/{0}.cshtml"
};

    private static List<string> AreaRegistrations;

    public MylesterViewEngine()
    {
        AreaRegistrations = new List<string>();

        BuildAreaRegistrations();

        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AreaRegistrations).ToArray();
    }

    private static void BuildAreaRegistrations()
    {
        string[] areaNames = RouteTable.Routes.OfType<Route>()
            .Where(d => d.DataTokens != null && d.DataTokens.ContainsKey("area"))
            .Select(r => r.DataTokens["area"].ToString()).ToArray();

        foreach (string areaName in areaNames)
        {
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/Shared/Timesheet/{0}.cshtml");
            AreaRegistrations.Add("~/Areas/" + areaName + "/Views/{1}/Timesheet/{0}.cshtml");
        }
    }
}

  protected void Application_Start()
    {
        //AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();


        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new MylesterViewEngine());

        //var unityContainer = ModelContainer.Instance;
        //DependencyResolver.SetResolver(new UnityDependencyResolver(unityContainer));
        Bootstrapper.Initialise();

    }

编辑 2:即使这样也行不通

   protected void Application_Start()
    {
        //AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        RazorViewEngine razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().FirstOrDefault();
        if (razorEngine != null)
        {
            string[] newPartialViewFormats = new[] { 
                    "~/Views/{1}/Timesheet/{0}.cshtml",
                    "~/Views/Shared/Timesheet/{0}.cshtml"
            };
            razorEngine.PartialViewLocationFormats =
                razorEngine.PartialViewLocationFormats.Union(newPartialViewFormats).ToArray();
        }

        //ViewEngines.Engines.Clear();
        //ViewEngines.Engines.Add(new MylesterViewEngine());

        //var unityContainer = ModelContainer.Instance;
        //DependencyResolver.SetResolver(new UnityDependencyResolver(unityContainer));
        Bootstrapper.Initialise();

    }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您链接到的答案是专门返回部分视图,而不是主要视图。所以里面的代码是这样写的:

    string[] NewPartialViewFormats =
    {
        "~/Views/{1}/Timesheet/{0}.cshtml",
        "~/Views/Shared/Timesheet/{0}.cshtml"
    };
    
    base.PartialViewLocationFormats = 
        base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    

    注意它使用了PartialViewLocationFormats 属性。如果您想对所有视图使用此方法,您还应该将格式添加到 ViewLocationFormats 属性:

    string[] NewPartialViewFormats =
    {
        "~/Views/{1}/Timesheet/{0}.cshtml",
        "~/Views/Shared/Timesheet/{0}.cshtml"
    };
    
    //Add to partial views
    base.PartialViewLocationFormats = 
        base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    
    //Add to main views
    base.ViewLocationFormats = 
        base.ViewLocationFormats.Union(NewPartialViewFormats).ToArray();
    

    【讨论】:

    • 感谢大卫,这是问题所在。
    【解决方案2】:

    如果您在子文件夹下传递而不是需要传递完整的 cshtml 页面路径。如果您不想提供完整路径而不是在共享文件夹下简单添加页面。

    【讨论】:

    • 链接答案的重点不是他不需要需要指定完整路径吗?
    • 也许是因为(就像我问的那样)它没有回答问题?
    • @DavidG OP 未提供编写完整答案的代码
    • 那你不应该提供答案。
    • @Malcolm 你在 Application_Start 下注册了吗?我会建议使用简单的@Html.Partial("/Views/Shared/Partial/myPartial.cshtml")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多