代码之家  ›  专栏  ›  技术社区  ›  TomHastjarjanto

ASP.NET MVC绑定特定模型导致POST请求出错

  •  3
  • TomHastjarjanto  · 技术社区  · 14 年前

    嗨,我的控制器中定义了以下两个操作

        [Authorize]
        [HttpGet]
        public ActionResult Edit()
        {
            ViewData.Model = HttpContext.User.Identity;
            return View();
        }
    
        [Authorize]
        [HttpPost]
        public ActionResult Edit(User model)
        {
    
    
            return View();
        }
    

    但是,如果我将编辑的数据发布到第二个操作,则会得到以下错误:

    Server Error in '/' Application.
    An item with the same key has already been added.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    
    Exception Details: System.ArgumentException: An item with the same key has already been added.
    
    Source Error:
    
    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
    
    Stack Trace:
    
    [ArgumentException: An item with the same key has already been added.]
       System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +51
       System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +7464444
       System.Linq.Enumerable.ToDictionary(IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) +270
       System.Linq.Enumerable.ToDictionary(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer) +102
       System.Web.Mvc.ModelBindingContext.get_PropertyMetadata() +157
       System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +158
       System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +90
       System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +50
       System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1048
       System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +280
       System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +257
       System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +109
       System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +314
       System.Web.Mvc.Controller.ExecuteCore() +105
       System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +39
       System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
       System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +34
       System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
       System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +59
       System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +44
       System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +7
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8679150
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
    

    我尝试了几项操作,比如重命名参数和删除可编辑字段,但似乎模型类型有问题,可能有什么问题?

    更新 如果使用bind属性添加前缀,则错误会消失,但我不确定原因..此外,我的代码将不起作用,因为输入元素不提供前缀

    2 回复  |  直到 14 年前
        1
  •  5
  •   queen3    14 年前

    谷歌也有几个同样的问题,但都没有回答。我建议检查是否有具有重复名称的属性:例如,对属性使用“new”重写,或者在不同的接口中使用相同的名称,等等。

    另外,我认为您可以参考ASP.NET MVC源代码来查看在DefaultModelBinder中到底发生了什么。

        2
  •  0
  •   mcaleaa    14 年前

    我也有同样的问题,在MVC 2中发回给控制器。问题最终与EntityFramework和BindAttribute(用于验证)相关。

    在我的例子中,我有一张叫学生的表,有一个外地国籍。我正在重构一个旧的数据库,并添加了一个新的表国籍(带有指向student的链接),以及一个新的nationalityid字段作为外键。

    问题是,我没有重命名原始国籍字段。学生实体现在有一个与字段(国籍)同名的关联(与国籍表)。

    此外,我一直在使用bindAttribute进行验证,并根据需要标记了国籍字段。

    我在数据库和实体框架中将国籍字段重命名为国籍。这消除了错误。希望这能帮助别人。