【问题标题】:InvalidOperationException when lots of checkboxes?很多复选框时出现 InvalidOperationException?
【发布时间】:2012-09-06 08:55:00
【问题描述】:

我有一个表单,它允许用户更改两种对象之间的依赖关系。

我有一个包含 30 个元素的集合,对于这 30 个元素中的每一个,我可以选择另一个集合的 26 个元素中的一个、几个或全部。所以它基本上意味着我有类似 30*26 的复选框(复杂但由于业务逻辑而复杂)。而且我可能在同一个页面上多次出现这种情况,所以我想我可能有 1100 多个元素。

基本上是存储在这个模型里的:

public class VarDependency{
   public int Id { get; set; }
   public String Name { get; set; }
   public List<ValueDependency> Values { get; set; }
}

public class ValueDependency{
   public int Id { get; set; }
   public String Name{ get; set; }
   public List<AvailableValue> Triggers { get; set; }
}

public class AvailableValue{
   public bool IsSelected { get; set; }
   public String Text { get; set; }
   public int Value { get; set; }
}

在视图中,我基本上有两个循环。对于每个可用的值,我都有一个 LabelFor(基于 Text 属性)、一个复选框(基于 IsSelected)和一个隐藏字段(基于 Value)。

当我没有那么多元素(比如 15*15)时,一切正常。我在控制器中接收数据并且可以处理它们,但我不知道为什么,如果我得到更多元素,我会很快得到一个异常,甚至在它到达控制器之前:

System.InvalidOperationException 由于对象的当前状态,操作无效。

System.Web.HttpException (0x80004005): The URL-encoded form data is not valid. ---> System.InvalidOperationException: Operation is not valid due to the current state of the object.
   at System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded()
   at System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding)
   at System.Web.HttpRequest.FillInFormCollection()
   at System.Web.HttpRequest.FillInFormCollection()
   at System.Web.HttpRequest.get_Form()
   at Microsoft.Web.Infrastructure.DynamicValidationHelper.ValidationUtility.CollectionReplacer.<>c__DisplayClass8.<MakeCollectionsLazy>b__2()
   at Microsoft.Web.Infrastructure.DynamicValidationHelper.ValidationUtility.CollectionReplacer.<>c__DisplayClass12.<ReplaceCollection>b__e()
   at Microsoft.Web.Infrastructure.DynamicValidationHelper.ValidationUtility.CollectionReplacer.<>c__DisplayClass12.<ReplaceCollection>b__11()
   at Microsoft.Web.Infrastructure.DynamicValidationHelper.DeferredCountArrayList.get_Count()
   at System.Collections.Specialized.NameObjectCollectionBase.get_Count()
   at System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection)
   at System.Web.HttpRequest.get_Form()
   at System.Web.HttpRequestWrapper.get_Form()
   at System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request)
   at System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
   at System.Web.Mvc.HttpPostAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
   at System.Web.Mvc.ActionMethodSelector.<>c__DisplayClass11.<RunSelectionFilters>b__d(ActionMethodSelectorAttribute attr)
   at System.Linq.Enumerable.All[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Web.Mvc.ActionMethodSelector.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos)
   at System.Web.Mvc.ActionMethodSelector.FindActionMethod(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.ReflectedControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
   at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
   at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

即使在 Visual Studio 的调试模式下,我也不会抛出异常。

我找不到有关如何解决此问题的任何线索,因此非常感谢任何帮助,当我们对版本进行一些测试时会出现问题:/

【问题讨论】:

    标签: c# asp.net asp.net-mvc iis


    【解决方案1】:

    我认为这可能是由于最近引入了一个页面可以拥有的默认最大控件数。您可以在 web.config 中更改它 看看这个问题:

    ASP.NET MS11-100: how can I change the limit on the maximum number of posted form values?

    【讨论】:

    • 是的,谢谢,我在 30 分钟前找到了相同的链接。不知道有没有其他类似的设置?因为我还有另一个类似的问题,而且我的模型是空的,但现在,我只能设法在 IIS 服务器上重现它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多