【问题标题】:Cannot resolve view of the parent controller无法解析父控制器的视图
【发布时间】:2012-11-23 15:26:53
【问题描述】:

创建一个控制器:

public abstract class MyBaseController : Controller
{
   public ActionResult MyAction(string id)
   {
      return View();
   }
}

比创建另一个从 MyBaseController 继承的特定控制器:

public class MyController : MyBaseController 
{

}

Views/MyBaseController 文件夹中有一个名为 MyAction.aspx 的视图 然后,调用 MyController/MyAction 方法。将产生以下异常:

视图“MyAction”或其主人 找不到。以下 搜索地点: ~/Views/MyController/MyAction.aspx ~/Views/MyController/MyAction.ascx ~/Views/Shared/MyAction.aspx ~/Views/Shared/MyAction.ascx

我可以让 MVC.NET 使用 Views/MyBaseController 文件夹中的视图吗?

【问题讨论】:

    标签: asp.net-mvc parentviewcontroller


    【解决方案1】:

    你应该等待一个更巧妙的答案,但这个工作:

    在默认的基础上创建一个新的视图引擎,并以这种方式覆盖 FindViewMethod:

    
     public class MyNewViewEngine : WebFormViewEngine
     {
         public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
         {
            var type = controllerContext.Controller.GetType();
    
                //Retrieve all the applicable views.
                var applicableViews = from m in type.GetMethods()
                                      where typeof(ActionResult).IsAssignableFrom(m.ReturnType) & m.Name == viewName
                                      select m;
    
                //Save the original location formats.
                var cacheLocations = ViewLocationFormats;
                var tempLocations = cacheLocations.ToList();
    
                //Iterate over applicable views and check if they have been declared in the given controller.
                foreach(var view in applicableViews)
                {
                    //If not, add a new format location to the ones at the default engine.
                    if (view.DeclaringType != type)
                    {
                        var newLocation = "~/Views/" + view.DeclaringType.Name.Substring(0, view.DeclaringType.Name.LastIndexOf("Controller")) + "/{0}.aspx";
                        if (!tempLocations.Contains(newLocation))
                            tempLocations.Add(newLocation);
                    }
                }
    
                //Change the location formats.
                ViewLocationFormats = tempLocations.ToArray();
    
                //Redirected to the default implementation
                var result = base.FindView(controllerContext, viewName, masterName, useCache);
    
                //Restore the location formats
                ViewLocationFormats = cacheLocations;
    
                return result;
       }
    }
    

    添加新的视图引擎:

    
     public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                ViewEngines.Engines.Clear();
                ViewEngines.Engines.Add(new MyNewViewEngine());
                RegisterRoutes(RouteTable.Routes);
            }
        }
    

    希望对你有帮助

    【讨论】:

    • 无需子类化——你可以通过设置ViewLocationFormats在现有的视图引擎上设置视图的搜索路径。
    • 为什么投反对票?该代码旨在与每个抽象继承链一起使用,而不仅仅是硬编码的。
    【解决方案2】:

    您需要将其添加到 shared 因为您在子控制器的上下文中。如果您想为不同的控制器提供不同的行为,那么您需要在每个子控制器视图文件夹中放置一个 MyAction 视图。

    不过,要回答您的问题,您可能可以让它在基本控制器文件夹中查找,但这需要您编写自己的请求处理程序,该处理程序在基本控制器文件夹中查找。默认实现仅在视图文件夹中查找当前控制器上下文,然后在共享文件夹中查找。但是,听起来您的视图是共享的,因此无论如何共享文件夹似乎都是一个好地方。

    【讨论】:

    • 感谢您的回复。如何覆盖控制器的行为以便在基本控制器文件夹中查找视图?
    • @Egor4eg:只需在您现有的 ViewEngine 上设置 ViewLocationFormats
    【解决方案3】:

    有可能,但不是很干净。

    public class MyController : MyBaseController 
    {
       public ActionResult MyAction(string id)
       {
           return View("~/Views/MyBaseController/MyAction.aspx");
       }
    }
    

    但是,如果您的视图 (MyAction.aspx) 包含对部分视图的引用,ASP.NET MVC 将在 Views/MyController 文件夹中查找它(但在那里找不到它!)。

    如果您的视图在多个控制器之间共享,最好按照 NickLarsen 的建议将其放置在 Views/Shared 文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2012-05-10
      • 2019-10-04
      • 2015-04-16
      相关资源
      最近更新 更多