一个具有相同键的项已经被添加。

168

每当我提交表单时,就会出现以下错误,也由于此错误未调用操作方法:

已经添加了具有相同键的项。

异常详细信息如下:

[ArgumentException:已经添加了具有相同键的项。]
System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +52
System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +9382923 System.Linq.Enumerable.ToDictionary(IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) +252
System.Linq.Enumerable.ToDictionary(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata() +228 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +392
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +147
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +98
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +2504
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +548
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +473
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +830 System.Web.Mvc.Controller.ExecuteCore() +136 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39
System.Web.Mvc.<>c__DisplayClass8.b__4() +65 System.Web.Mvc.Async.<>c__DisplayClass1.b__0() +44 System.Web.Mvc.Async.<>c__DisplayClass8`1.b__7(IAsyncResult _) +42 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +141 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

ViewPage

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/XYZ.Master"
    Inherits="System.Web.Mvc.ViewPage<XYZ.Models.Admin.AdminSegmentCommissionsModel>" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
        Create
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        <% using (Html.BeginForm()) {%>    
            <div class="box3">
                <div class="userinfo">
                    <h3>Admin Segment Commissions</h3>
                </div>
                <div class="buttons-panel">
                    <ul>
                       <li>
                           <input type="submit" value="Save" class="save" />
                       </li>
                       <li>
                           <%:Html.ActionLink("Cancel", "Index", new { controller = "AdminSegmentCommissions" }, new { @class = "cancel" })%>
                           <%--<input type="button" value="Cancel" class="cancel" onclick="document.location.href='/AirlineLedgerTransactionReceiver/Index'" />--%>
                       </li>
                   </ul>
               </div>
           </div>
           <div class="row-1">
               <div class="form-box1 round-corner">
                   <div class="form-box1-row">
                       <div class="form-box1-row-content float-left">
                           <div>
                               <label>
                                   <%: Html.LabelFor(model => model.FromSegmentNumber) %></label>
                                   <%: Html.TextBoxFor(model => model.FromSegmentNumber) %>
                                   <%: Html.ValidationMessageFor(model => model.FromSegmentNumber) %>
                          </div>
                      </div>
                  </div>
              </div>
          </div>
      <%} %>



我非常仔细地检查了我要发布的JSON,发现有一个重复属性——一个拼成了CustomerID,另一个拼成了CustomerId。由于Javascript打字错误,两个属性都被添加到了我要发布的JSON中,所以提醒一下这个问题已得到解决。 - AVH
26个回答

264

很可能,你的模型中包含了同样的属性两次。也许你正在使用new隐藏基本属性。

解决方法是重写该属性或者使用另外一个名称。

如果你分享你的模型,我们将能够详细说明。


17
在C#中,如果你有variable1和Variable1这两个变量名(会报错)。同时,要检查确保没有相似的edmx名称(例如表格列名为"CURRENCY",其中一个导航属性的名称为"Currency")。 - Rob Koch
7
@Naveen太好了,问题已经解决!我意识到这里为什么会编译错误。与C#不同,该框架的某些部分是大小写不敏感的。 - Aliostad
13
有人知道如何识别哪个是“相同的钥匙”吗? - ClayKaboom
2
我在调整一些视图模型(添加一个Id属性)后遇到了这个问题。问题原因是JS已经为一些UI管理添加了一个小写的"id",但是在提交时,JSON对象具有"Id"和"id"属性,它们映射到ASP.NET的模型绑定器中的相同键,因此出现了这个错误。 - Svend
2
PS:这在MVC3中是允许的,但在MVC5中不允许。不确定为什么会更改。 - Julian

24

我有同样的问题,以下是我的解决方法。我的ViewModel中有两个名字相同的属性。其中一个在BaseViewModel中,另一个在派生模型中。

public class BaseviewModel{
  public int UserId { get; set; }
}


 public class Model : BaseViewModel
 {
     public int UserId { get; set; }
 }

我已将其更改为

public class BaseviewModel{
   public int UserId { get; set; }
}


public class Model : BaseViewModel
{
    public int User_Id { get; set; }
}

现在它正在良好运作。


1
谢谢,简单提醒一下,即使基类和模型具有相同的属性名称但大小写不同,例如Base:User,Model:user,也会发生这种情况。 - Richard Housham

19

我有两个模型属性像这样

public int LinkId {get;set;}
public int LinkID {get;set;}

很奇怪它会为这两个东西报错哈哈...


14

我曾经遇到类似的问题,后来发现这是因为我有一个同名的公共属性(其实应该是私有的),只是大小写不同。

public string PropertyName {get;set;} // actually set propertyName, get propertyName
public string propertyName {get;set;}

本应该

public string PropertyName {get;set;} 
private string propertyName {get;set;}

9
我在使用AJAX提交Javascript对象时出现了问题,这个问题不在我的C#模型中。我在页面上使用Angular进行绑定,并且将Notes字段大写,而我的C#对象期望小写的notes字段。更详细的错误提示会更好。
C#:
class Post {
    public string notes { get; set; }
}

Angular/Javascript:

<input ng-model="post.Notes" type="text">

2
这是一个稍微不同的答案,我的C#类中没有重复的属性,但是发送到我的控制器的JSON数据却有。如果其他人在寻找类似问题时在他们的C#代码中找不到问题,这可能会对他们有用。 - Jason Goemaat
和Goematt一样。即使我绑定的C#对象完全忽略了那些键,但被发送的JSON对象仍然有重复的名称,导致失败。在我看来,这很愚蠢,甚至可能是一个bug。我无法控制被发送的JSON对象,因此无法预料会发送哪些额外的字段。 - kukabuka

6
我遇到了同样的问题,我正在使用foreach循环遍历我的对象,并将结果添加到Dictionary中,但由于数据库中键有重复,所以出现了冲突。
 foreach (var item in myObject)
        {
            myDictionary.Add(Convert.ToString(item.x), 
                                   item.y);

        }

item.x 出现了重复的值


3
我找到了答案。原因是变量名相同,例如 int a 和 string a。存在两个同名的变量。

2
在我的情况下,当您编译代码时,它可以正常运行。但是,如果调用具有类似示例代码的字典的静态类的静态字段之一,则会引发异常。 示例代码
public static AClass
{
    public static Dictionary<string, string> ADict = new Dictionary<string, string>()
        {
            {"test","value1"},{"test","value2"},
        };
}
说明 ADict添加了两次“test”键。因此,当您调用静态类时,它会抛出异常。

2

2021年3月

dotnetfiddle上进行演示。

在我的情况下,字典中的key是重复的。 输入图像描述


1
我希望添加一个答案,但是我在这里没有看到。它与被接受的答案非常相关,但是我的模型上没有重复的属性,而是我的Javascript出了问题。
我正在进行一些Ajax保存操作,我正在重新构建模型以发送回服务器。当我第一次初始化页面时,我将原始模型设置为一个变量:
var currentModel = result.Data;

我的 result.Data 有一个属性: result.Data.Items

过了一段时间,我想通过Ajax保存一些东西。处理的一部分是从某些侧面的过程中获取数组,并将其设置为我的 currentModel.Items 属性并发送 currentModel 到服务器。

然而,在我的Javascript中,我使用了以下代码:

currentModel.items = getData();

我没注意到,但在 Visual Studio 中,对于 JavaScript 属性,它会自动将首字母转换为小写(这可能是 ReSharper 的一个功能)。然后,当我尝试保存时,我得到了 OP 发布的确切错误,因为 currentModel 现在有 currentModel.itemscurrentModel.Items
将 "items" 改为 "Items" 就解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接