1

我想在 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 中,它不知道从哪里获得该局部视图。

我应该怎么办 ?

非常感谢 !

4

3 回答 3

5

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

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

然后在你的主题中创建一个文件/ViewsViewEmail.cshtml你可以在需要时引用作为属性传入的参数Model。调用Display将导致ViewEmail形状的呈现。

于 2013-07-02T04:46:50.557 回答
0

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

PartialViewResult path = PartialView("PartialViewEmail");
string tmp = path.ViewName;
string result = RenderRazorViewToString(tmp, null);
于 2013-06-28T09:40:28.823 回答
0

我选择了如下扩展方法:

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"
于 2013-10-06T12:27:46.630 回答