使用JSON返回Razor部分视图(ASP MVC 3)

5

在MVC 2中,我可以通过return Json()返回一个ascx部分视图字符串。但是在新的Razor .cshtml视图中,我无法弄清楚如何做到这一点。我一直收到错误:Type 'ASP.CustomerForm_cshtml' does not inherit from 'System.Web.UI.UserControl'.

这个部分视图继承自System.Web.Mvc.WebViewPage<T>,如果我从System.Web.UI.UserControl<T>继承,则会出现另一个错误,与第一个错误相同。

您有什么想法如何在ASP MVC 3和Razor视图引擎中解决这个问题吗?

这是我的ControlToString函数:

    private string ControlToString(string controlPath, object model)
    {
        ViewPage page = new ViewPage();
        ViewUserControl ctl = (ViewUserControl)page.LoadControl(controlPath);
        page.Controls.Add(ctl);
        page.ViewData.Model = model;
        page.ViewContext = new ViewContext();
        System.IO.StringWriter writer = new System.IO.StringWriter();
        System.Web.HttpContext.Current.Server.Execute(page, writer, false);
        string outputToReturn = writer.ToString();
        writer.Close();
        //return this.Json(outputToReturn.Trim());
        return outputToReturn.Trim();
    }
2个回答

6
这可能会对您有所帮助,因为我是凭记忆写的,除了验证返回的渲染后的cshtml文件之外,没有进行其他测试。我假设这是控制器中的一个方法。
private string ControlToString(string controlPath, object model) {
    CshtmlView control = new CshtmlView(controlPath);

    HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter());
    control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer);

    string value = ((StringWriter)writer.InnerWriter).ToString();

    return value;
}

谢谢,它有效。我将视图作为字符串获取了。但是在您的代码中没有任何地方处理模型。我尝试在CshtmlView()中添加模型作为参数,但它不接受模型作为参数。有什么想法吗? - Martin at Mennt
我已经解决了,你需要在代码中添加 this.ViewData.Model = model;,然后它就能正常工作了 :D - Martin at Mennt

5

这是MVC 3 Beta版本的代码:

    private string ControlToString(string controlPath, object model)
    {
        //CshtmlView control = new CshtmlView(controlPath);
        RazorView control = new RazorView(this.ControllerContext, controlPath, null, false, null);

        this.ViewData.Model = model;

        HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter());
        control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer);

        string value = ((StringWriter)writer.InnerWriter).ToString();

        return value;
    }

谢谢你的回复 - 除了一个问题,一切都看起来很好 - 控制路径的值我还没有弄清楚。在MVC中,路径是如何确定的?它是物理文件系统路径吗? - codedog
算了吧...看起来"~/Views/blah/blah.cshtml"行得通 :o) - codedog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接