0

我有一个淘汰模型被发布到 AJAX 以在下拉值更改时加载数据。当我尝试获取该数据时,我收到此错误:

System.InvalidOperationException:由于对象的当前状态,操作无效。生成时间:格林威治标准时间 2013 年 6 月 6 日星期四 21:56:30

System.InvalidOperationException:由于对象的当前状态,操作无效。在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) 在 System .Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) 在

我在 web.config 中尝试了这两种设置:

<appSettings>
   <add key="aspnet:MaxHttpCollectionKeys" value="20000" />
   <add key="aspnet:MaxJsonDeserializerMembers" value="20000" />
</appSettings>

在超高的数字。那并没有解决问题。我不确定问题是什么。这是我对下拉列表的看法:

 @Html.DropDownListFor(x => x.ParentUser, new SelectList(Model.ParentUsers, "Id", "DisplayName"), "--Select a " + @Model.ParentRole.DisplayName + "--")

我的行动:

[HttpPost]
    public JsonResult GetAssignedUsers(KeyValueModel assigneeRole, KeyValueModel parentRole, Guid parentUser)
    {
        Role assignee = _roleService.GetOne(x => x.Id == assigneeRole.Id);
        Role parent = _roleService.GetOne(x => x.Id == parentRole.Id);
        User parentUsr = _userService.GetOne(x => x.Id == parentUser);
        List<KeyValueModel> assignedUsers = _roleAssignmentService.GetAssignedUsers(parent, assignee,parentUsr)
                                                                  .Select(
                                                                      x => new KeyValueModel(x.Id, x.DisplayName))
                                                                  .ToList();

        return Json(assignedUsers);
    }

和 Jquery 代码:

$(function() {
        $('#ParentUser').change(function() {

            mappedModel.changedParentUser = true;
            mappedModel.ParentUser($(this).val());

            $.ajax({
                url: '@Url.Action("GetAssignedUsers", "RoleAssignments")',
                type: 'POST',
                data: ko.toJSON(mappedModel),
                contentType: 'application/json; charset=utf-8',
                success: function(data) {
                    mappedModel.AssignedUsers(data);
                }
            });

        });
    });

此代码在我本地运行时有效,没有问题,只有在我尝试在生产环境中运行时才会出现错误。请帮忙。

编辑:

尝试以下使我的 AJAX 动作只有一个参数的解决方案不起作用:

这是我传递的模型:

public class AssignModel : ActionModel
{
    public bool CanAssignAll { get; set; }
    public KeyValueModel ParentRole { get; set; }
    public Guid? ParentUser { get; set; }
    public KeyValueModel AssigneeRole { get; set; }

    public List<KeyValueModel> AssignedUsers { get; set; }

    public List<KeyValueModel> ParentUsers { get; set; }
    public List<KeyValueModel> AssigneeUsers { get; set; }
}

 public class ActionModel
{
    public bool ActionSuccess { get; set; }
    public string ActionMessage { get; set; }
    public bool CanEdit { get; set; }
    public bool CanCreate { get; set; }
}

public class KeyValueModel
{
    public Guid Id { get; set; }
    public string DisplayName { get; set; }
}

这些是正在使用的模型。堆栈跟踪确实看起来像反序列化的问题,但使用尝试更新 JsonValueFactoryProvider 如下所述也不起作用。

再次编辑:我的模型肯定有问题,但我不知道是什么。我将我的ajax方法更改为原来的3个参数,然后在jquery中,只发布了我需要的数据而不是整个模型,它起作用了,错误就消失了。但是,当我保存对象时(也使用 AJAX 方法并将完整模型作为参数传递),发生了同样的错误。但是我的模型并没有什么疯狂的,所以我不明白。我什至尝试更改Guid?只是一个指导,看看是否可以解决它,但没有。

4

3 回答 3

2

我发现问题出在淘汰赛映射插件上。我应该ko.mapping.toJSON()在 ajax POST 上使用,而不仅仅是ko.toJSON(). 当使用映射插件时,你的淘汰模型有很多额外的属性。我不确定这些额外属性中究竟是什么导致了问题,因为我几乎对所有 CRUD 页面都这样做了,但是这个特定页面只有这样的错误。但是,无论如何,这是一个好主意,因为 POST 数据要小得多,而且模型本质上是“POCO-fied”。

于 2013-06-14T17:14:32.037 回答
0

将 JSON 反序列化为对象时出现问题。使用 JSON.NET 反序列化对象,它将为您解决许多问题。在此处查看示例实现:https ://gist.github.com/DalSoft/1588818

于 2013-06-06T22:31:04.843 回答
0

我不能确定,但​​我认为接受 JSON 作为 POST 数据的 MVC POST 操作可以/应该只接受一个参数。在您的情况下,您的方法签名应该是这样的:

public JsonResult GetAssignedUsers(GetAssignedUsersModel getAssignedUsersModel)
{
   ...
}

模型可能是这样的:

public class GetAssignedUsersModel
{
    public Guid ParentUser {get;set;}
    etc...
}

注意:这适用于 MVC3 及更高版本,不适用于 MVC 1 和 MVC 2。对于那些早期版本,单个参数应该是一个字符串,您可以使用 JSON.NET 将字符串反序列化为您的模型,正如 Tomas 建议的那样。

于 2013-06-06T23:55:27.023 回答