MVC Ajax.BeginForm, вызывающий действие, которое возвращает JsonResult, не выполняется на клиенте - PullRequest
2 голосов
/ 31 июля 2011

Я пытаюсь использовать .Net Ajax.BeginForm, чтобы отправить форму и получить список объектов.

@using (Ajax.BeginForm("ValidateEmployee", new AjaxOptions { OnBegin = "onBegin", OnSuccess = "onSucess", UpdateTargetId = "results"} )

Проблема в том, что, когда мой контроллер возвращает JsonResult, и я преобразовываю свой возвращенный список в json, обратный вызов OnSuccess никогда не вызывается, и мой div с идентификатором «results» не обновляется. Но обратный вызов onBegin называется. Контроллер выглядит следующим образом.

public JsonResult ValidateEmployee(Employee emp)
{
    ...
    List<Role> roles = new Role();
    foreach(var x in myCollection)
    {
        roles.Add(new Role { ID = x.ID, Name = x.Name });
    }
    return Json(roles);
}

Я подтвердил, что Json(roles) правильно преобразовывает список в действительный json. Но я не могу его использовать, потому что onSuccess никогда не запускается.

Странно, если я не преобразую список в json и просто верну его в виде списка .Net, будут вызваны оба обратных вызова и мой элемент для обновления выходных данных System.Collections.Generic.List'1 [Models.Role]. Так что это не JSON, и у меня нет возможности использовать данные.

Так почему onSuccess не вызывается, когда я возвращаю объект json из моего контроллера?

Я использую MVC 3 и ссылаюсь на jquery.unobtrusive-ajax.js.

Спасибо за любую помощь.

1 Ответ

8 голосов
/ 31 июля 2011

Я не думаю, что вы можете использовать Ajax.BeginForm с UpdateTargetId для своего сценария, поскольку вы используете JsonResult в качестве результата действия. Ajax.BeginForm, с учетом UpdateTargetId попытается добавить полученный объект к указанному вами элементу. Так как возвращаемый объект является объектом Json, он выдает ошибку. Ошибка будет что-то вроде:

    uncaught exception: [Exception... "Could not convert JavaScript argument arg 0 
[nsIDOMDocumentFragment.appendChild]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)"
 location: "JS frame :: http://localhost:58248/Scripts/jquery-1.4.4.js :: <TOP_LEVEL> :: 
line 5167" data: no]

После удаления UpdateTargetId вы должны увидеть срабатывание onSuccess.

function onSuccess(data){
 //data is the json object
 // do your html manipulation here
}
...