2

我正在尝试使用 .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。

谢谢你的帮助。

4

1 回答 1

8

我认为您不能将Ajax.BeginFormwithUpdateTargetId用于您的场景,因为您正在使用JsonResult该操作的结果。Ajax.BeginForm, givenUpdateTargetId将尝试将结果对象附加到您指定的元素。由于返回的是 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
}
于 2011-07-31T11:40:33.660 回答