使用Sitecore,如何使用cshtml文件和模型呈现自定义字段?

时间:2015-11-06 15:25:15

标签: sitecore sitecore8 sitecore-mvc sitecore8.1

我在Sitecore中有一个自定义字段 - 一个带有数字和富文本编辑器的复合字段。

编辑方面的工作很好,但是当没有页面编辑器渲染字段时,我想将其格式委托给cshtml文件 - 将我选择的对象作为模型发送。

我可以拦截DoRender中的渲染:

    protected override void DoRender(HtmlTextWriter output)
    {
        if (!Sitecore.Context.PageMode.IsPageEditor)
        {
            //here is where I want to delegate the output to a cshtml DisplayTemplate with the Value as the Model.
        }
        else
        {
            base.DoRender(output);
        }
    }

但是如何将输出委托给cshtml DisplayTemplate,并将Value作为模型?

1 个答案:

答案 0 :(得分:2)

您必须将视图渲染为字符串,然后您可以将其与HtmlTextWriter一起渲染出来。

这将呈现一个字符串视图:

public static string RenderPartialToString(string controlName, object viewData)
{
    ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };

    viewPage.ViewData = new ViewDataDictionary(viewData);
    viewPage.Controls.Add(viewPage.LoadControl(controlName));

    StringBuilder sb = new StringBuilder();
    using (StringWriter sw = new StringWriter(sb))
    {
        using (HtmlTextWriter tw = new HtmlTextWriter(sw))
        {
            viewPage.RenderControl(tw);
        }
    }
    return sb.ToString();
}

然后你可以修改你的代码:

protected override void DoRender(HtmlTextWriter output)
{
    if (!Sitecore.Context.PageMode.IsPageEditor)
    {
        //here is where I want to delegate the output to a cshtml DisplayTemplate with the Value as the Model.
        var model = new {}; // create your model
        var viewString = RenderPartialToString("~/path/to/view.cshtml", model);
        output.Write(viewString);
    }
    else
    {
        base.DoRender(output);
    }
}

请注意,此方法在呈现.cshtml文件时会绕过Sitecore渲染管道。

RenderPartialToString方法的归功 - How to Render Partial View into a String