Asp.net mvc MVC4视图引擎搜索位置

Asp.net mvc MVC4视图引擎搜索位置,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我已经在这篇文章的底部实现了mcfea答案,但它不起作用 我在“视图/共享”下有一个子文件夹,名为“时间表” 这是个例外 找不到视图“时间表”或其主视图,或者没有视图引擎 支持搜索的位置。下列地点为 搜索:~/Views/Home/Timesheet.aspx~/Views/Home/Timesheet.ascx ~/Views/Shared/Timesheet.aspx~/Views/Shared/Timesheet.ascx ~/Views/Home/Timesheet.cshtml~/V

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

我在“视图/共享”下有一个子文件夹,名为“时间表”

这是个例外

找不到视图“时间表”或其主视图,或者没有视图引擎 支持搜索的位置。下列地点为 搜索:~/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();

    }
公共类MyListerViewEngine:RazorViewEngine
{
私有静态只读字符串[]NewPartialViewFormats=
{
“~/Views/{1}/Timesheet/{0}.cshtml”,
“~/Views/Shared/Timesheet/{0}.cshtml”
};
私有静态列表区域注册;
公共视图引擎()
{
AreaRegistrations=新列表();
BuildAreaRegistrations();
base.PartialViewLocationFormats=base.PartialViewLocationFormats.Union(NewPartialViewFormats.ToArray();
base.PartialViewLocationFormats=base.PartialViewLocationFormats.Union(AreaRegistrations.ToArray();
}
私有静态无效BuildAreaRegistrations()
{
string[]areaNames=RouteTable.Routes.OfType()
.Where(d=>d.DataTokens!=null&&d.DataTokens.ContainsKey(“区域”))
.Select(r=>r.DataTokens[“区域”].ToString()).ToArray();
foreach(areaNames中的字符串areaName)
{
AreaRegistrations.Add(“~/Areas/”+areaName+”/Views/Shared/Timesheet/{0}.cshtml”);
AreaRegistrations.Add(“~/Areas/”+areaName+“/Views/{1}/Timesheet/{0}.cshtml”);
}
}
}
受保护的无效应用程序\u Start()
{
//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(新的MylesterViewEngine());
//var unityContainer=ModelContainer.Instance;
//SetResolver(新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();

    }
受保护的无效应用程序\u Start()
{
//RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
RazorViewEngine razorEngine=ViewEngines.Engines.OfType().FirstOrDefault();
if(razorEngine!=null)
{
字符串[]newPartialViewFormats=new[]{
“~/Views/{1}/Timesheet/{0}.cshtml”,
“~/Views/Shared/Timesheet/{0}.cshtml”
};
razorEngine.PartialViewLocationFormats=
PartialViewLocationFormats.Union(newPartialViewFormats.ToArray();
}
//ViewEngines.Engines.Clear();
//ViewEngines.Engines.Add(新的MylesterViewEngine());
//var unityContainer=ModelContainer.Instance;
//SetResolver(新UnityDependencyResolver(unityContainer));
Bootstrapper.Initialise();
}

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

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

string[] NewPartialViewFormats =
{
    "~/Views/{1}/Timesheet/{0}.cshtml",
    "~/Views/Shared/Timesheet/{0}.cshtml"
};

base.PartialViewLocationFormats = 
    base.PartialViewLocationFormats.Union(NewPartialViewFormats).ToArray();
请注意,它使用了属性。如果要对所有视图使用此方法,还应将格式添加到属性:

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();

链接答案的全部要点不就是他不需要指定完整路径吗?可能是因为(就像我问的)它没有回答问题?@DavidG OP没有提供编写完整答案的代码,那么你就不应该提供答案。@Malcolm让你在Application_Start下注册。我建议使用简单的
@Html.Partial(“/Views/Shared/Partial/myPartial.cshtml”)
谢谢David,这就是问题所在。