6

最终编辑:

在遵循 Darin Dimitrov 的回答后,我发现问题最终是对控制器方法的 AJAX 调用UpdateForm()返回了一个空字符串。这是我在遇到不同问题后不久发现必要的修改。传递一个空字符串会导致 Firefox 的解析器阻塞(而 Chrome 和 IE 显然不在乎)所以我用一个空的div.

编辑:

感谢 Darin Dimitrov 在下面的建议,我发现我遇到问题的原因是在提交相关表单时抛出错误。

jQuery 错误

错误显示“无法在层次结构中的指定点插入节点”。每次提交表单时都会抛出此问题。我在 POST 数据中注意到它似乎认为这是一个 XMLHttpRequest。这是原因吗(有问题的 AJAX 请求只是返回 HTML)?这是来自 Firebug 的 POST 数据:

发布数据 1

发布数据 2

发布数据 3

此错误显示为“XML Parsing Error -- No Element Found”。

仅供参考-返回的 HTML 始终是一个空字符串...


我有一个在 IIS7 上运行的 MVC3 应用程序。在我的一个观点中,我有一个使用 Microsoft HTML 帮助函数构建的表单:

@using (Ajax.BeginForm("UpdateForm", new AjaxOptions { UpdateTargetId = "TargetDiv", InsertionMode = InsertionMode.InsertAfter, OnSuccess = "ClearTextBox" }))
{
    @Html.TextArea("txtInput", new { id = "txtInput", cols = "20", rows = "5", wrap = "virtual" })
    <input id="send" class="button" type="submit" value="Send"/><br />
} 

当控制器提供此视图时,这将生成以下 HTML:

<form action="/RootName/ControllerName/UpdateForm" data-ajax="true" data-ajax-mode="after" data-ajax-success="ClearTextBox" data-ajax-update="#TargetDiv" id="form0" method="post">
     <textarea cols="20" id="txtInput" name="txtInput" rows="5" wrap="virtual"></textarea>    
     <input id="send" class="button" type="submit" value="Send"><br>
</form>

我基本上在这里尝试做的是将被TextArea调用文本中的文本txtInput,并将其附加到被Div调用函数的末尾,TargetDiv每当Send单击上面的按钮时,txtInput在附加完成后通过ClearTextBox()方法(Javascript)清除文本. 附加始终适用于每个浏览器;当我在 Internet Explorer 或 Chrome 中运行时,文本的清除工作得很好。但是,Firefox 似乎不想调用该ClearTextBox()方法。

data-ajax-successFirefox 与表单签名中的此选项不兼容吗?


我尝试过的事情

我找到了这个人: Ajax.BeginForm doesn't call onSuccess

解决方案是添加此脚本:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>

我正在调用这个脚本:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

...但我试着换掉它以防万一。没有喜悦。

C# 聊天室中的一些人要求我尝试更改方法调用以包含括号,以便 HTML 如下所示:

<form action="/WebChat/TMWC/UpdateForm" data-ajax="true" data-ajax-mode="after" data-ajax-success="ClearTextBox()" data-ajax-update="#chatText" id="form0" method="post">
     <textarea cols="20" id="txtInput" name="txtInput" rows="5" wrap="virtual"></textarea>    
     <input id="send" class="button" type="submit" value="Send"><br>
</form>

但这没有帮助。

C# Chat 中的人还建议我将 Javascript 调用替换为警报 - 如下所示:

<form action="/WebChat/TMWC/UpdateForm" data-ajax="true" data-ajax-mode="after" data-ajax-success="alert('yo!')" data-ajax-update="#chatText" id="form0" method="post">
     <textarea cols="20" id="txtInput" name="txtInput" rows="5" wrap="virtual"></textarea>    
     <input id="send" class="button" type="submit" value="Send"><br>
</form>

虽然 Chrome 会弹出消息框,但 Firefox 不会!

4

1 回答 1

1

新创建的 ASP.NET MVC 3 应用程序中的状态没有重现。

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult UpdateForm()
    {
        return Content(DateTime.Now.ToLongTimeString());
    }
}

查看 ( ~/Views/Home/Index.cshtml):

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script type="text/javascript">
    function ClearTextBox() {
        $('textarea').val(''); 
    }
</script>

<form action="/Home/UpdateForm" data-ajax="true" data-ajax-mode="after" data-ajax-success="ClearTextBox" data-ajax-update="#TargetDiv" id="form0" method="post">
     <textarea cols="20" id="txtInput" name="txtInput" rows="5" wrap="virtual"></textarea>    
     <input id="send" class="button" type="submit" value="Send"><br>
</form>

<div id="TargetDiv"></div>

在 Chrome、FF 和 IE 中运行良好。

此外,您可能希望确保 Content-Type 响应 HTTP 标头与您发送的实际响应相匹配。例如,我看到很多人application/json在响应正文中发送带有一些无效 JSON 的响应标头,这会导致更敏感的解析器阻塞。

于 2012-06-22T21:11:21.160 回答