为了账号安全,请及时绑定邮箱和手机立即绑定

我是否可以在ASP.NETMVC中指定“搜索视图”的自定义位置?

/ 猿问

我是否可以在ASP.NETMVC中指定“搜索视图”的自定义位置?

慕斯709654 2019-06-26 13:10:40

我是否可以在ASP.NETMVC中指定“搜索视图”的自定义位置?

我的MVC项目有以下布局:

  • /控制器
    • /演示
    • /Demo/DemoArea1控制器
    • /Demo/DemoArea 2控制器
    • 等等.。
  • /意见
    • /演示
    • /Demo/DemoArea 1/Index.aspx
    • /Demo/DemoArea 2/Index.aspx

但是,当我有了这个DemoArea1Controller:

public class DemoArea1Controller : Controller{
    public ActionResult Index()
    {
        return View();
    }}

我得到“视图‘索引’或它的主错误找不到”错误,与通常的搜索位置。

如何指定“Demo”视图子文件夹中“Demo”命名空间搜索中的控制器?


查看完整描述

3 回答

?
斯蒂芬大帝

您可以轻松地扩展WebFormViewEngine以指定要查看的所有位置:

public class CustomViewEngine : WebFormViewEngine{
    public CustomViewEngine()
    {
        var viewLocations =  new[] {  
            "~/Views/{1}/{0}.aspx",  
            "~/Views/{1}/{0}.ascx",  
            "~/Views/Shared/{0}.aspx",  
            "~/Views/Shared/{0}.ascx",  
            "~/AnotherPath/Views/{0}.ascx"
            // etc
        };

        this.PartialViewLocationFormats = viewLocations;
        this.ViewLocationFormats = viewLocations;
    }}

确保您记得通过修改Global.asax.cs中的Application_start方法来注册视图引擎。

protected void Application_Start(){
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new CustomViewEngine());}


查看完整回答
反对 回复 2019-06-26
?
红糖糍粑

现在MVC 6中,您可以实现IViewLocationExpander接口,而不影响视图引擎:

public class MyViewLocationExpander : IViewLocationExpander{
    public void PopulateValues(ViewLocationExpanderContext context) {}

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        return new[]
        {
            "/AnotherPath/Views/{1}/{0}.cshtml",
            "/AnotherPath/Views/Shared/{0}.cshtml"
        }; // add `.Union(viewLocations)` to add default locations
    }}

哪里{0}是目标视图名,{1}-控权人名称及{2}-地区名称。

您可以返回您自己的位置列表,并将其与默认值合并。viewLocations (.Union(viewLocations))或者只是改变它们(viewLocations.Select(path => "/AnotherPath" + path)).

若要在mvc中注册自定义视图位置扩展程序,请在ConfigureServices方法Startup.cs档案:

public void ConfigureServices(IServiceCollection services){
    services.Configure<RazorViewEngineOptions>(options =>
    {
        options.ViewLocationExpanders.Add(new MyViewLocationExpander());
    });}


查看完整回答
反对 回复 2019-06-26
?
慕雪6442864

实际上,有一个比硬编码到构造函数中的路径更容易的方法。下面是扩展Razor引擎以添加新路径的示例。有一件事我不完全确定,就是您在这里添加的路径是否将被缓存:

public class ExtendedRazorViewEngine : RazorViewEngine{
    public void AddViewLocationFormat(string paths)
    {
        List<string> existingPaths = new List<string>(ViewLocationFormats);
        existingPaths.Add(paths);

        ViewLocationFormats = existingPaths.ToArray();
    }

    public void AddPartialViewLocationFormat(string paths)
    {
        List<string> existingPaths = new List<string>(PartialViewLocationFormats);
        existingPaths.Add(paths);

        PartialViewLocationFormats = existingPaths.ToArray();
    }}

还有你的Global.asax.cs

protected void Application_Start(){
    ViewEngines.Engines.Clear();

    ExtendedRazorViewEngine engine = new ExtendedRazorViewEngine();
    engine.AddViewLocationFormat("~/MyThemes/{1}/{0}.cshtml");
    engine.AddViewLocationFormat("~/MyThemes/{1}/{0}.vbhtml");

    // Add a shared location too, as the lines above are controller specific
    engine.AddPartialViewLocationFormat("~/MyThemes/{0}.cshtml");
    engine.AddPartialViewLocationFormat("~/MyThemes/{0}.vbhtml");

    ViewEngines.Engines.Add(engine);

    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);}

需要注意的一点是:您的自定义位置需要它根目录中的ViewStart.cshtml文件。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 438 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信