【问题标题】:Check if (partial) view exists from HtmlHelperMethod从 HtmlHelperMethod 检查(部分)视图是否存在
【发布时间】:2013-04-25 10:08:31
【问题描述】:

有谁知道是否可以从 HtmlHelperExtension 中检查部分视图是否存在?

我知道控制器可以使用以下方法:

 private bool ViewExists(string name)
 {
     ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null);
     return (result.View != null);
 }

来源:Does a View Exist in Asp.Net MVC?

但是您不能在帮助程序中执行上述操作,因为您无权访问控制器上下文。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    如果您使用的是 Asp.Net Core (Mvc),您可以像这样检查 HtmlHelper 扩展中是否存在“视图”:

        public static IHtmlContent PartialOzz<TModel>(IHtmlHelper<TModel> htmlHelper, partialViewName)
        {
            var requestServices = htmlHelper.ViewContext.HttpContext.RequestServices;
            var viewEngine = requestServices.GetService<ICompositeViewEngine>();
    
            var viewEngineResult = viewEngine.GetView(htmlHelper.ViewContext.ExecutingFilePath, partialViewName, isMainPage: false);
            if (viewEngineResult.Success)
                return htmlHelper.PartialAsync(partialViewName, me.Model).Result;
    
            viewEngineResult = viewEngine.FindView(htmlHelper.ViewContext, partialViewName, isMainPage: false);
            if (viewEngineResult.Success)
                return htmlHelper.PartialAsync(partialViewName, me.Model).Result;
    
            
            return new HtmlString($"### {partialViewName} Not Found ###");
         }
    

    【讨论】:

      【解决方案2】:

      但您不能在帮助程序中执行上述操作,因为您无权访问控制器上下文。

      哦,是的,您确实可以访问:

      public static HtmlString MyHelper(this HtmlHelper html)
      {
          var controllerContext = html.ViewContext.Controller.ControllerContext;
          var result = ViewEngines.Engines.FindView(controllerContext, name, null);
          ...
      }
      

      【讨论】:

      • 当您的局部视图位于共享文件夹中的另一个自定义子文件夹中时会怎样!然后它不会找到它:(
      • Razor 页面应用程序(使用 Core 2.2)似乎没有 ControllerContext。你知道它是否可以通过其他方式完成吗?
      • 我为 Aspnet core 3.x, 5x 写了答案,你可以查看。
      【解决方案3】:

      为了完整起见,找局部视图的方法,其实如下。

      public static HtmlString MyHelper(this HtmlHelper html)
      {
           var controllerContext = html.ViewContext.Controller.ControllerContext;
           ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, name);
           ...
      }
      

      并且一定要包含视图的扩展;剃须刀的 cshtml 或 webforms 视图引擎的 aspx。

      【讨论】:

      • 当您的部分视图位于共享文件夹内的自定义子文件夹中时,这也不起作用。
      • @Ciwan 您需要为子文件夹添加路径,例如:ViewEngines.Engines.FindPartialView(controllerContext, "subfolderpath/" + name);
      猜你喜欢
      • 2014-06-08
      • 2015-12-29
      • 1970-01-01
      • 2020-03-02
      • 2023-03-23
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多