调用返回JsonResult的操作的MVC Ajax.BeginForm在客户端上不成功

时间:2011-07-31 11:09:48

标签: asp.net-mvc-3 jsonresult ajax.beginform

我正在尝试使用.Net的Ajax.BeginForm来提交表单并获取对象列表。

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

问题是,当我的控制器返回一个JsonResult并将我返回的列表转换为json时,永远不会调用OnSuccess回调,并且不会更新我的id为“results”的div。但是调用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,我没有办法使用这些数据。

那么,当我从控制器返回一个json对象时,为什么没有调用onSuccess?

我正在使用MVC 3而我正在引用jquery.unobtrusive-ajax.js。

感谢您的帮助。

1 个答案:

答案 0 :(得分:8)

我不认为您可以将Ajax.BeginFormUpdateTargetId一起用于您的方案,因为您使用JsonResult作为操作的结果。 Ajax.BeginFormUpdateTargetId将尝试将结果对象追加到您指定的元素。由于返回的是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
}