我正在尝试使用.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。
感谢您的帮助。
答案 0 :(得分:8)
我不认为您可以将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
}