【问题标题】:Why does this only work in Firefox? Rendering Of Asp.net MVC partial View and passing result back through ajax为什么这只适用于 Firefox?渲染 Asp.net MVC 部分视图并通过 ajax 传回结果
【发布时间】:2009-11-08 05:36:45
【问题描述】:

基本上我有这个

在我的 Asp.net 控制器中

public ActionResult RenderMyView()
{
  data = // some data to used in rendering my partial view
  return PartialView("PartialView", data);

 //edit 
  I also return a json result if an error occurs. Say if I get an SQLException I will return  a json result back  and not render any partialview.
}

我的 ParitalView 呈现一个表格,“数据”基本上是数据库中的列。因此,它将数据中的信息生成一个包含那么多行的表。

这是在我的 java 脚本文件中,并在下拉列表项更改时激活。

$.getJSON('RenderMyView', { 'field': field}, function(response)
{
    $('#id').after('<div>' + response + '</div>');
});

所以它的作用是调用 RenderMyView 渲染一个 partialView 并将响应代码添加到我的页面。

这就是我的想法。它转到我的控制器并呈现并返回该 PartialView。一旦它被渲染它只是html。所以它发送回 html,然后我将该 html 代码添加到 div 中。

这在 Firefox 上可以正常工作,但其他浏览器无法正常工作。我厌倦了 Opera、Google chrome、IE 8、Safari,它们都不工作。

我不知道为什么,因为我没有可信赖的萤火虫。

我厌倦了使用 IE 8 firebug clone 但由于某种原因它没有进入这部分

$('#id').after('<div>' + response + '</div>');

我在每一行都设置了断点,但是在它进入服务器后,调试就结束了,它永远不会回到调试器,并且服务器端没有发生错误,因为我正在使用 VS2008 遍历它调试器,没有任何崩溃。

编辑

似乎根本没有进入响应部分。就像我在那里放了一个警报框,它永远不会被触发。

【问题讨论】:

    标签: c# .net asp.net jquery asp.net-mvc


    【解决方案1】:

    您的局部视图是否返回 JSON 结果?如果没有,您的调用可能无法正常工作,因为其他浏览器期待 JSON 结果并接收 Html/文本结果。

    如果您的局部视图返回 Html,那么您需要使用 jQuery Ajax 调用 using。

    $.ajax()
    

    或者,如果您要将结果转储到 div 中,我喜欢使用

    $("#Id").load("/RenderMyView/");
    

    运行 Ajax 调用并将其转储到选定元素中

    编辑

    在您的控制器中,您应该捕获错误并返回包含错误消息的内容结果。

    public ActionResult RenderMyView()
    {
      try
      {
        data = // some data to used in rendering my partial view
        return PartialView("PartialView", data);
      }
      catch(Exception e)
      {
        //catches any errors returns it back as plain text
        //log the error that was thrown
        return Content("Error: " + e.Message);
      }
    }
    

    内容只是从控制器返回纯文本。然后,您需要在 JavaScript 中检查此结果。

    $.ajax({
      url: 'RenderMyView',
      data: {field:'field'},
      dataType: 'html/text',
      success: function(response) {
        if (response.indexOf("Error:") == 1) {
          //handle error
        }
        else {
          $('#id').after('<div>' + response + '</div>');
        }
      }
    });
    

    【讨论】:

    • 不,我的部分视图不返回任何 json。但是,我的示例代码中未显示的是,如果该方法中的某些内容失败。假设发生 SQLExecption,我返回一个 json 结果。所以我有时会返回 json 结果,有时会返回 html 结果。如何更改它以便其他浏览器理解这一点?
    • 我可以在控制器中渲染部分视图并将其存储到字符串中并将其作为 json 结果发送回来吗?
    • 我认为你必须做一个或另一个,我从未见过有人同时做这两个。如果它们是错误的,为什么需要返回 json 结果?您的局部视图不能只返回错误消息吗?如果您想在 JavaScript 中返回错误时执行某些操作,您可以在返回的 html 中查找错误文本。
    • 嗯,firefox 可以处理这个问题。那么正在发生的事情是我有不同类型的错误消息。所以我会为每个人准备一面旗帜。就像说“失败”将是第一个 json 结果,下一个将是错误消息。现在我知道我的部分观点是否失败。此外,我可以在服务器端写下我的错误消息,并将它们保存在同一个地方,并且很容易更改。我不确定如何使部分视图返回错误。除非我制作一个全新的局部视图并发送一个包含 html 表的视图或一个仅发送该错误的视图。
    • 您对此有控制器操作吗?我认为这个逻辑最好放在控制器/动作中。然后它可以捕获并记录发生的任何错误,并决定返回哪个视图,一个带有数据或错误消息。
    【解决方案2】:

    我赞成这个电话;

    $.post("/Home/jQueryGetCalendarItems", { month: this.id }, function(retHTML) {
    

    在 FF 和 IE 中没有问题。在上面的代码中,我返回一个 PartialView,然后像你一样替换一个 div 的内容。

    编辑

    要注意的另一件事是# 的使用。您的控件名称可能与您预期的不同。执行 [View/Source] 以确认控件 ID 等。我自己更喜欢使用“.ClassName”。

    【讨论】:

      【解决方案3】:

      如果您想接收 HTML,您不应该使用 $.ajax() 而不是 $.getJSON() 吗?这样做有什么不同吗?

      $.ajax({
          url: 'RenderMyView',
          data: {field:'field'},
          dataType: 'html',
          success: function(response, textStatus) {
              $('#id').after('<div>' + response + '</div>');
          }
      });
      

      【讨论】:

      • 查看我在“边缘”帖子下的评论。
      猜你喜欢
      • 2015-12-26
      • 2011-06-18
      • 2011-04-08
      • 2015-04-07
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多