1

我想构建一个允许在内部呈现视图的 API:

  1. iframe(常规视图)。
  2. 或者作为 JS (document.write)。

有时开发人员会使用 Iframe,有时他会使用脚本。

所以有一次你可以调用 iframe:

//will render <html><body><div>I am a div</div></body></html>
<iframe src="/page/mysqldata?mod=iframe"></iframe>

有一次我想把 html 作为 JS

//will render document.write('<div>I am a div</div>');
<script  src="/page/mysqldata?mod=js"></script>

你知道如何设置它的教程吗?
顺便说一句,我的观点很复杂,有很多@Html带有RenderSections 和调用的@Html.Partial 调用。

底线是我想为 html 提供 2 种不同的方法,iframe 和脚本,但我想保留一个视图。

谢谢

4

2 回答 2

0

您可以做的是RenderPartialViewToString()这个 SO answer中获取 Alex 的实现,它可以让您直接在控制器内将视图呈现为字符串。

您可以创建一个视图和一个部分。将所有内容绑定到模型的部分,视图可以添加<html><body>...等。使用 Razor 创建所有视图,并根据需要使它们变得复杂,它们只是常规视图。

所以现在你的控制器应该有两个动作:

  1. 对于 iframe 中的 html 内容:只渲染视图,所以这是一个常规的 MVC 操作
  2. 对于 JS 内容:调用 RenderPartialViewToString,而不是输出 html,执行以下操作:

    public JavaScriptResult AsJavascript()
    {
        var theModel = //create the model
        var content = // call to RenderPartialViewToString(this, "PartialViewName", theModel);
        var script = String.Format("document.write('{0}')",
               content.Replace("'", "\'").Replace(Environment.NewLine, ""));
        return this.JavaScript(script);
    }
    

过去我不得不做类似的事情,但是我使用jquery而不是直接写入文档,所以代码更简洁,通过创建一个DIV,用 设置内容div.html(content),然后将该 div 附加到页面的正文. 但结果最终应该是一样的。

于 2012-12-01T16:17:45.883 回答
0

我希望我在这里没有遗漏任何东西,但是您的控制器操作应如下所示:

public ActionResult MySqlData(string mod)
{
    if (string.Compare("js", mod, StringComparison.OrdinalIgnoreCase) == 0)
        return JavaScript("path_to_the_script");
    else if (string.Compare("iframe", mod, StringComparison.OrdinalIgnoreCase) == 0)
        return View("your_view_details_here");
    return HttpNotFound("explain why this action failed");
}
于 2012-12-01T16:18:41.563 回答