0

ドロップダウン値が変更されたときにデータをロードするために、ノックアウト モデルが AJAX に投稿されています。そのデータを取得しようとすると、次のエラーが発生します。

System.InvalidOperationException: オブジェクトの現在の状態のため、操作は無効です。生成: 2013 年 6 月 6 日 (木) 21:56:30 GMT

System.InvalidOperationException: オブジェクトの現在の状態のため、操作は無効です。System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 深度) で System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度) で System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 深度) で.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度) で System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 深度) で

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アクションに1つのパラメータしか持たないようにする以下の解決策を試してもうまくいきませんでした:

これが私が渡しているモデルです:

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を変更してみましたか?Guidだけに、それが修正されるかどうかを確認しますが、いいえ。

4

3 に答える 3

2

問題はノックアウト マッピング プラグインにあることがわかりました。ko.mapping.toJSON()の代わりに ajax POSTで使用する必要がありますko.toJSON()。マッピング プラグインを使用する場合、ノックアウト モデルには多くの追加プロパティがあります。私はほとんどすべての CRUD ページに対してこれを行っていたので、これらの余分なプロパティの何が問題を引き起こしているのか正確にはわかりませんが、この特定のページにはそのようなエラーしかありませんでした。ただし、POST データははるかに小さく、モデルは本質的に「POCO 化」されているため、とにかく良い考えです。

于 2013-06-14T17:14:32.037 に答える
0

JSON をオブジェクトに逆シリアル化しているときに問題が発生しました。JSON.NET を使用してオブジェクトを逆シリアル化すると、今後の多くの問題が解決されます。ここでサンプル実装を参照してください: https://gist.github.com/DalSoft/1588818

于 2013-06-06T22:31:04.843 に答える