ドロップダウン値が変更されたときにデータをロードするために、ノックアウト モデルが 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だけに、それが修正されるかどうかを確認しますが、いいえ。