【问题标题】:MVC3 - Allow view to be rendered as html or JSMVC3 - 允许将视图呈现为 html 或 JS
【发布时间】:2012-12-01 14:36:04
【问题描述】:

我想构建一个允许在内部呈现视图的 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 和脚本,但我想保留一个视图。

谢谢

【问题讨论】:

  • 可以使用 AJAX 通过脚本检索 html。不清楚你想用 script vs iframe 做什么,或者是什么决定了使用哪种情况。 AJAX 可能是答案
  • 您是否尝试在控制器中将其公开为 2 个不同的操作? On action 将返回一个 jsonresult 另一个将返回一个 viewresult。
  • @Ikaso - 谢谢,但是如何将 html 视图呈现为 json?你可以发布一个例子吗?这:return Json(View(viewModel),JsonRequestBehavior.AllowGet); 将不起作用...
  • @charlietfl - 我已经编辑了问题和示例代码,希望对您有所帮助。谢谢
  • @SexyMF - 您不会将视图呈现为 Json。一种方法返回 JsonResult,另一种方法呈现 ViewResult。如果你想实现最大的重用,你可以让这两个方法调用返回相同视图模型的第三个私有方法。在返回视图的方法上,您将视图模型作为模型发送。在返回 JsonResult 的方法上,您将视图模型发送到 JsonResult,以便将其序列化为 Json。

标签: javascript asp.net-mvc-3 views render


【解决方案1】:

您可以做的是从 this SO answer 中获取 Alex 对 RenderPartialViewToString() 的实现,这样您就可以直接在控制器内部将视图呈现为字符串。

您可以创建一个视图和一个部分。将所有内容绑定到模型的部分,视图可以添加&lt;html&gt;&lt;body&gt;...等。 使用 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 附加到页面的正文中。但结果最终应该是一样的。

【讨论】:

    【解决方案2】:

    我希望我没有遗漏任何内容,但是您的控制器操作应该如下所示:

    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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2017-06-10
      • 2015-03-19
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多