2014-10-07 71 views
2

我已經在這篇文章的底部實現了mcfea答案,但它不起作用。MVC 4查看引擎搜索位置

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

我有下查看的子目錄/共享稱爲時間表。

這是例外。

未找到'時間表'或其主人的視圖或沒有查看引擎 支持搜索的位置。以下位置是 搜索:〜/ Views/Home/Timesheet.aspx〜/ Views/Home/Timesheet.ascx 〜/ Views/Shared/Timesheet.aspx〜/ Views/Shared/Timesheet.ascx 〜/ Views/Home /Timesheet.cshtml〜/查看/主頁/ Timesheet.vbhtml 〜/查看/共享/ Timesheet.cshtml〜/查看/共享/ 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(); 

    } 

回答

2

您鏈接到的答案是專門返回部分視圖,而不是主視圖。所以它裏面的代碼是這樣的:

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

感謝大衛這是問題。 – Malcolm 2014-10-08 03:17:51

0

如果您在子文件夾下傳遞比需要傳遞完整的cshtml頁面路徑。如果您不想提供完整路徑而不是簡單添加共享文件夾下的頁面。

+0

不整點鏈接的答案,他*不*需要指定全路徑? – DavidG 2014-10-07 08:56:43

+0

爲什麼在答案上投下一票,請指定 – Amit 2014-10-07 08:57:51

+0

也許是因爲(就像我問過的)它不回答這個問題? – DavidG 2014-10-07 08:58:29