2012-06-22 4 views
6

FINAL EDIT:MVC3 Ajax.BeginForm OnSuccess не работает в Firefox

После выполнения ответа от Darin Димитров, я обнаружил, что проблема заканчивал тем, что вызов AJAX для метода контроллера UpdateForm() был возвращая пустую строку. Это была модификация, которую я нашел нужным некоторое время назад после возникновения другой проблемы. Передача пустой строки приводила к тому, что синтаксический анализатор Firefox задыхался (хотя, по-видимому, Chrome и IE не заботились), поэтому я заменил пустую строку пустым div.

Edit:

Благодаря предложениям Дарин Димитрова ниже, я обнаружил, что причина у меня была проблема из-за ошибки бросают всякий раз, когда данная форма представляется.

JQuery Error

Ошибка чтения «Узел не может быть вставлена ​​в заданной точке в иерархии». Это бросается каждый раз при отправке формы. Я заметил в данных POST, что кажется, что это XMLHttpRequest. Это причина (запрос AJAX, о котором идет речь, просто возвращает HTML)? Вот данные POST с Firebug:

POST Data 1

POST Data 2

POST Data 3

Эта ошибка чтения "XML Синтаксический Ошибка - Нет Элемент Found".

FYI - HTML, возвращается всегда пустая строка ...


У меня есть приложение MVC3 работает на IIS7. В одном из моих взглядов, у меня есть форма строится с использованием вспомогательной функции 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().

Является ли Firefox не совместимым с этим опцией data-ajax-success в форме подписи?


Вещи я Пробовал

Я нашел этот парень: 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 не делает!

+0

«data-ajax-success» выглядит как пользовательский атрибут, просто говорящий, какой метод вызывать, поэтому я сомневаюсь, что это проблема с самим атрибутом. Я не уверен, что такое dev. tools firefox имеет (я использую Chrome в основном), но я бы проверил там, чтобы увидеть, показывает ли он какие-либо ошибки JS в другом месте кода. – justinb138

+0

Я использую Firebug, но он ничего не указал мне ... = ( –

+0

Не могли бы вы отправить вам метод ClearTextBox()? Просто попробовал это (файл-> новый проект mvc3, используемый 'jquery.unobtrusive-ajax .min.js') и отлично работает в FF. Моя версия ClearTextBox такова: 'function ClearTextBox() {$ (" # txtInput "). val (" ");}' –

ответ

1

Статус не воспроизводится во вновь создаваемом приложении ASP.NET MVC 3.

Контроллер:

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

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

View (~/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.

Также вы можете убедиться, что HTTP-заголовок ответа Content-Type соответствует фактическому ответу, который вы отправляете. Например, я видел, что так много людей отправляют ответный заголовок application/json с некоторым недействительным JSON в теле ответа, который создает более чувствительные парсеры для подавления.

+0

Спасибо за вашу помощь! (Будущие читатели: см. Мои изменения в вопросе) –