Before MVC5 and previous versions, we wanted to control the path to the view file, we had to IViewEngine override the interface's FindPartialView or method, and FindView all the view engines were inherited from the IViewEngine interface, such as the default RazorViewEngine . But in the new version MVC6, the path to the view file is not quite the same, there are currently two ways, one is through RazorViewEngine , the other is through the new feature IViewLocationExpander interface.
To control the view path by Razorviewengine
In the new version RazorViewEngine , the class provides two virtual properties ( AreaViewLocationFormats and ViewLocationFormats ) that can be used to override controls without having to override the FindPartialView or FindView methods, as shown in the following example:
public class Themeviewengine:razorviewengine {public Themeviewengine (irazorpagefactory pagefactory, IRAZORVIEWFA Ctory viewfactory, Iviewlocationexpanderprovider viewlocationexpanderprovider, Iviewlocationcache ViewLocationCach
E): Base (Pagefactory, Viewfactory, Viewlocationexpanderprovider, Viewlocationcache) {} public override ienumerable<string> Areaviewlocationformats {get {var value = new Random ().
Next (0, 1); var theme = value = = 0? "Theme1": "Theme2"; Other conditions can be used to set the type of skin return base.
Areaviewlocationformats.select (F => f.replace ("/views/", "/views/" + theme + "/")); } public override ienumerable<string> Viewlocationformats {get {var value = new Random ().
Next (0, 1); var theme = value = = 0? "Theme1": "Theme2"; Other conditions can be used to set the type of skin return base.
Viewlocationformats.select (F => f.replace ("/views/", "/views/" + theme + "/")); }
}
}
You can then complete the substitution of the view engine by modifying the Mvcoptions instance Properties Viewengines, as follows:
Services. Addmvc (). configure<mvcoptions> (Options =>
{
options). Viewengines.clear ();
Options. Viewengines.add (typeof (Themeviewengine));
In this way, when the system finds the view file, it executes according to the new registered ThemeViewEngine logic.
To control the view path by Iviewlocationexpander
In MVC6, Microsoft also provides a new way to control the path of the view file, which is the IViewLocationExpander interface that implements the custom logic by implementing the interface, and can also use the relevant context object. Examples are as follows:
public class Themeviewlocationexpander:iviewlocationexpander {public void Populat Evalues (Viewlocationexpandercontext context) {var value = new Random ().
Next (0, 1); var theme = value = = 0?
"Theme1": "Theme2"; Context.
values["theme"] = theme;
Public virtual ienumerable<string> expandviewlocations (Viewlocationexpandercontext context, Ienumerable<string> viewlocations) {return viewlocations.select (f => f.replace ("/views/", "/Vie") ws/"+ context.
values["Theme"] + "/"); }
}
In the above customization IViewLocationExpander , 2 methods are implemented, and the method allows us to add a response in the context of the PopulateValues ExpandViewLocations PopulateValues ViewLocationExpanderContext key value pairs for subsequent use, through which we can use the context object to find ActionContext and HttpContext object, In order to use these objects to respond to the judgment operation, and the ExpandViewLocations method, only in the absence of the view cache or in the view cache can not find the corresponding key of the view file to call the method, in this method, we could dynamically return the location of the view.
Finally, we Startup.cs implement the registration purpose by modifying the RazorViewEngineOptions properties of the instance object in the ViewLocationExpanders following code:
Services. configure<razorviewengineoptions> (Options =>
{
options). Viewlocationexpanders.add (typeof (Themviewlocationexpander));