Can I specify a custom location to “search for views” in ASP.NET MVC?

后端 未结 10 2316
故里飘歌
故里飘歌 2020-11-22 06:08

I have the following layout for my mvc project:

  • /Controllers
    • /Demo
    • /Demo/DemoArea1Controller
    • /Demo/DemoArea2Controller
    • etc
10条回答
  •  耶瑟儿~
    2020-11-22 06:17

    Last I checked, this requires you to build your own ViewEngine. I don't know if they made it easier in RC1 though.

    The basic approach I used before the first RC was, in my own ViewEngine, to split the namespace of the controller and look for folders which matched the parts.

    EDIT:

    Went back and found the code. Here's the general idea.

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName)
    {
        string ns = controllerContext.Controller.GetType().Namespace;
        string controller = controllerContext.Controller.GetType().Name.Replace("Controller", "");
    
        //try to find the view
        string rel = "~/Views/" +
            (
                ns == baseControllerNamespace ? "" :
                ns.Substring(baseControllerNamespace.Length + 1).Replace(".", "/") + "/"
            )
            + controller;
        string[] pathsToSearch = new string[]{
            rel+"/"+viewName+".aspx",
            rel+"/"+viewName+".ascx"
        };
    
        string viewPath = null;
        foreach (var path in pathsToSearch)
        {
            if (this.VirtualPathProvider.FileExists(path))
            {
                viewPath = path;
                break;
            }
        }
    
        if (viewPath != null)
        {
            string masterPath = null;
    
            //try find the master
            if (!string.IsNullOrEmpty(masterName))
            {
    
                string[] masterPathsToSearch = new string[]{
                    rel+"/"+masterName+".master",
                    "~/Views/"+ controller +"/"+ masterName+".master",
                    "~/Views/Shared/"+ masterName+".master"
                };
    
    
                foreach (var path in masterPathsToSearch)
                {
                    if (this.VirtualPathProvider.FileExists(path))
                    {
                        masterPath = path;
                        break;
                    }
                }
            }
    
            if (string.IsNullOrEmpty(masterName) || masterPath != null)
            {
                return new ViewEngineResult(
                    this.CreateView(controllerContext, viewPath, masterPath), this);
            }
        }
    
        //try default implementation
        var result = base.FindView(controllerContext, viewName, masterName);
        if (result.View == null)
        {
            //add the location searched
            return new ViewEngineResult(pathsToSearch);
        }
        return result;
    }
    

提交回复
热议问题