【问题标题】:Get link to PartialView in Orchard CMS在 Orchard CMS 中获取部分视图的链接
【发布时间】:2013-06-28 07:50:26
【问题描述】:

我想在 Orchard CMS 中将 RazorView 渲染为字符串,但我不知道如何获取部分视图的链接以获取字符串。

public string RenderRazorViewToString(string viewName, object model)
        {
            ViewData.Model = model;
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
                var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
                viewResult.View.Render(viewContext, sw);
                viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
                return sw.GetStringBuilder().ToString();
            }
        }

如果在另一个 MVC 项目中 - 而不是 Orchard - 代码可以正常工作:

string result = RenderRazorViewToString("~/Views/Home/PartialViewEmail.cshtml", null);

但在 Orchard CMS 中,它不知道从哪里获取局部视图。

我该怎么办?

非常感谢!

【问题讨论】:

    标签: asp.net-mvc razor content-management-system orchardcms asp.net-mvc-partialview


    【解决方案1】:

    然而,更好的解决方案是采用果园的做事方式,使用形状。如果你这样做:

    @Display.ViewEmail(SomeParameter: 42, SomeOtherParameter: "foo")
    

    然后在/Views 下创建一个名为ViewEmail.cshtml 的主题文件,如果需要,可以引用作为Model 属性传入的参数。对Display 的调用将导致ViewEmail 形状的呈现。

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题。很简单,如下图

      PartialViewResult path = PartialView("PartialViewEmail");
      string tmp = path.ViewName;
      string result = RenderRazorViewToString(tmp, null);
      

      【讨论】:

        【解决方案3】:

        我选择了如下扩展方法:

        public static class ViewExtensions
        {
            public static string RenderToString(this PartialViewResult partialView)
            {
                var httpContext = HttpContext.Current;
        
                if (httpContext == null)
                {
                    throw new NotSupportedException("An HTTP context is required to render the partial view to a string");
                }
        
                var controllerName = httpContext.Request.RequestContext.RouteData.Values["controller"].ToString();
        
                var controller = (ControllerBase)ControllerBuilder.Current.GetControllerFactory().CreateController(httpContext.Request.RequestContext, controllerName);
        
                var controllerContext = new ControllerContext(httpContext.Request.RequestContext, controller);
        
                var view = ViewEngines.Engines.FindPartialView(controllerContext, partialView.ViewName).View;
        
                var sb = new StringBuilder();
        
                using (var sw = new StringWriter(sb))
                {
                    using (var tw = new HtmlTextWriter(sw))
                    {
                        view.Render(new ViewContext(controllerContext, view, partialView.ViewData, partialView.TempData, tw), tw);
                    }
                }
        
                return sb.ToString();
            }
        }
        

        它允许我执行以下操作:

        var html = PartialView("SomeView").RenderToString();
        

        如果出于某种原因我仍想获取视图的完整路径,我可以执行以下操作:

        var path = ((BuildManagerCompiledView)view).ViewPath; // Will be something like "~/Views/Shared/SomeView.cshtml"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-05
          • 1970-01-01
          • 2014-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多