Remove Default MVC .vbhtml Paths - Implement Custom ViewEngine
Since .vbhtml is not a supported extension in Sitefinity (at least according to the documentation here: http://docs.sitefinity.com/for-developers-how-does-sitefinity-use-asp-net-mvc only .cshtml is supported), Telerik should probably inherit the RazorViewEngine or the BuildManagerViewEngine and trim down the list of paths (and supported file types in the IViewEngine.FileExtensions property) to reduce the number of file system locations needing to be checked when a view is first looked up in FindView(...) or FindPartialView(...) before the view location is cached.
Also, partial view lookup out of the box does not work with Sitefinity. If you take the valid default paths:
"~/Views/1/0.cshtml",
"~/Views/Shared/0.cshtml"
and change them to:
"~/Mvc/Views/1/0.cshtml",
"~/Mvc/Views/Shared/0.cshtml"
then the partial view lookup works as expected. You'd fix both of these issues by not using the default RazorViewEngine implementation.
Here's what I did. We aren't using areas, so I wiped those, but you'd just want to remove the default .vbhtml paths in the area path sets for your purposes. This might help:
using System.Web.Mvc;
public class MyViewEngine : RazorViewEngine
private static string[] EmptyArray = new string[] ;
private static string[] SitefinityFileExtensions = new string[]
"cshtml"
;
private static string[] SitefinityMasterLocationFormats = new string[]
"~/Views/1/0.cshtml",
"~/Views/Shared/0.cshtml"
;
// The first two paths are only here for now to support EditorTemplate lookups at the root - Sitefinity bug work around
private static string[] SitefinityPartialViewLocationFormats = new string[]
"~/Views/1/0.cshtml",
"~/Views/Shared/0.cshtml",
"~/Mvc/Views/1/0.cshtml",
"~/Mvc/Views/Shared/0.cshtml"
;
private static string[] SitefinityViewLocationFormats = new string[]
"~/Views/1/0.cshtml",
"~/Views/Shared/0.cshtml"
;
public MyViewEngine()
// Remove area support to reduce view lookup paths (improves performance)
base.AreaMasterLocationFormats = EmptyArray;
base.AreaPartialViewLocationFormats = EmptyArray;
base.AreaViewLocationFormats = EmptyArray;
base.MasterLocationFormats = SitefinityMasterLocationFormats;
base.PartialViewLocationFormats = SitefinityPartialViewLocationFormats;
base.ViewLocationFormats = SitefinityViewLocationFormats;
// Sitefinity MVC only supports C# - remove VB support
base.FileExtensions = SitefinityFileExtensions;
and then I have this registered in Global.asax.cs Application_Start:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new WebFormViewEngine());
ViewEngines.Engines.Add(new MyViewEngine());
Hi,
More information about this issue could be found in the discussions listed below:
- http://www.sitefinity.com/developer-network/forums/bugs-issues-/mvc-partial-view-lookup-does-not-work-ootb
- http://www.sitefinity.com/developer-network/forums/bugs-issues-/rendering-a-child-action-using-html-renderaction-is-broken#0oLSnPjxA0yioaUkTUhZMQ
Regards,
Svetoslav Manchev
Telerik
I think that the second issue you were trying to link to is the wrong link, as that is an unrelated bug that I also found. I think this is the second link you were looking for:
Hi Richard,
You are correct, thank you for the clarification.
Regards,
Svetoslav Manchev
Telerik