具有相同键的项目已被添加


135

每当我提交表单时,都会收到此错误,并且由于以下原因未调用action方法:

具有相同键的项目已被添加。

以及异常详细信息:

[ArgumentException:已添加具有相同键的项。]
System.ThrowHelper.ThrowArgumentException(Exception资源资源)+52
System.Collections.Generic.Dictionary`2.Insert(TKey键,TValue值,布尔值添加)+9382923系统.Linq.Enumerable.ToDictionary(IEnumerable`1源,Func`2 keySelector,Func`2 elementSelector,IEqualityComparer`1比较器)+252
System.Linq.Enumerable.ToDictionary(IEnumerable`1源,Func`2 keySelector,IEqualityComparer`1比较器)+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,对象模型)+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标签)+54
System.Web.Mvc.Async.AsyncResultWrapper。结束(IAsyncResult asyncResult,对象标记)+40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult结果)+38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+8836913 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值且已完成)+184

浏览页面

<%@ 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>
      <%} %>


2
您需要为此添加更多上下文。向我们显示控制器代码,并描述您要执行的确切操作。自己进行一些调试,以便您的问题更加冗长,而不仅仅是大量的代码/堆栈。
CHEV

我检查了我的JSON,我非常紧密地发布了它,并发现了一个重复的属性-一个拼写为CustomerID和一个拼写为CustomerId-通过JavaScript拼写错误,这两个属性都已添加到我要发布的JSON中,因此仅需注意就可以解决此问题我。
AVH

Answers:


225

您最有可能拥有两次包含相同属性的模型。也许您是new用来隐藏基本属性的。

解决方案是覆盖属性或使用其他名称。

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


16
在C#中,例如,如果您具有variable1和Variable1(它将引发错误)。另外,检查并确保没有类似的edmx名称(表列具有“ CURRENCY”,导航属性名称之一具有“ Currency”)
Robert Koch 2012年

7
@Naveen伟大的是固定的!我看到了如何编译但在这里抛出错误。框架的某些部分(与C#不同)不区分大小写。
Aliostad 2012年

9
有人会知道如何识别“相同的钥匙”吗?
ClayKaboom 2014年

1
在摆弄一些视图模型(添加了一个Id属性)之后,我开始得到这个。缺点是JS已经在对象上放置了“ id”(小写字母id)以进行某些UI管理,但是在提交时,JSON对象同时具有“ Id”和“ id”属性,它们映射到相同的键中。 ASP.NET的模型绑定程序,因此会出现此错误。
Svend

1
PS:在MVC3中允许,但在MVC5中不允许。不确定为什么更改了它。
朱利安2015年

20

我遇到了同样的问题,这就是我解决的方法。我的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; }
}

现在工作正常。


谢谢,只是快速回答,即使基础和模型具有相同的属性名称且大小写不同,也会发生这种情况,例如Base:User,Model:user
Richard Housham

12

我有一个类似的问题,发现那是因为我有一个类似命名的公共财产(应该是私有的),只是大小写不同。

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;}

12

我有2个这样的模型属性

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

奇怪的是,这两个哈哈抛出了这个错误。


6

我的问题不在我的C#模型中,而在我使用AJAX发布的javascript对象中。我正在使用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#代码的问题..
贾森Goemaat

与Goematt相同。即使我绑定到的c#对象完全忽略了这些键,正在发送的JSON对象也具有重复的名称,但仍然失败。这是愚蠢的,甚至在我看来是个错误。我没有控制要发送的JSON对象,因此无法说明正在发送的所有其他字段。
kukabuka

5

我遇到了同样的问题,我foreach遍历了我的对象并将结果添加到中,Dictionary<string, string>并且数据库中的键重复了。

 foreach (var item in myObject)
        {
            myDictionary.Add(Convert.ToString(item.x), 
                                   item.y);

        }

item.x 具有重复的值


3

我找到了答案,这是因为变量。像int和字符串a。有两个同名的变量。


1

这是我做的工作,目的是找出两次被添加的密钥。我从http://referencesource.microsoft.com/DotNetReferenceSource.zip下载了源代码,并设置了VS以调试框架源。在VS中打开Dictionary.cs来运行该项目,一旦页面加载,在该行添加了调试ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);并能够看到“键”值。我意识到在JSON中,变量的一个字母为大写字母,但在我的模型中为小写字母。我修复了模型,现在相同的代码起作用了。


1

我在MVC 5和Visual Studio Express 2013中实现了这一点。我有两个属性,IndexAttribute如下所示。注释掉其中之一并重新编译后,将成功使用Entity Framework为MVC 5控制器提供视图。奇怪的是,当我取消注释该属性,重新编译并再次尝试时,脚手架运行得很好。

可能底层的实体数据模型或“某物”被缓存/损坏,并且删除并重新添加该IndexAttribute简单物触发了对该“某物”的重建。

[Index(IsUnique = true)]
public string Thing1 { get; set; }

[Index(IsUnique = true)]
public string Thing2 { get; set; }

1

在MVC 5中,我发现暂时注释掉对Entity Framework模型的引用,并在脚手架时重新编译项目侧会导致此错误。一旦完成脚手架,我便不会注释代码。

public Guid CreatedById { get; private set; }
// Commented out so I can scaffold: 
// public virtual UserBase CreatedBy { get; private set; }

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.itemsANDcurrentModel.Items

从“项目”到“项目”的简单更改解决了该问题。


1

我的问题是我有一个@ Url.Action,并且两次通过同一属性的值发送


1

就我而言,仅在编译代码时,它就可以正常运行。但是,调用具有字典(如示例代码)的静态类的静态类的静态字段之一会引发异常。

样例代码

public static AClass
{
    public static Dictionary<string, string> ADict = new Dictionary<string, string>()
        {
            {"test","value1"},{"test","value2"},
        };
}

说明 ADict已添加两次“测试”键。因此,当您调用静态类时,它将引发异常。


0

我有同样的问题。从MVC 3迁移到MVC 5后,它似乎对我而言。

我有自定义编辑器模板,之前必须像这样使用它:

@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField", this.ViewData)

要解决此问题,我必须删除传递的ViewData对象。所以最后我有了:

@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField")

希望能帮助到你。


0

我有同样的错误。在我已经确定自己的想法已经崩溃之后,因为我已经重命名了几乎所有的模型属性,所以解决方案是删除“所有Syncfusion控件”上的一个引用,并为该控件的各个控件添加引用。(来自Nuget)


0

就我而言,问题的根源是客户端json中的重复属性名称,只是区分大小写而有所不同。


0

遇到此错误的另一种方法是来自具有未命名列数据集。将数据集序列化为JSON时会引发错误。

该语句将导致错误:

select @column1, @column2

添加列名将防止错误:

select @column1 as col1, @column2 as col2

0

我有同样的错误,但差异原因是b / c。使用实体框架。在共享我的代码和解决方案之前,我还需要在这里添加一件事,我在控制器方法上有一个断点,但它并没有在那里中断,只是抛出了异常500内部服务器错误。

我是通过ajax将数据从视图发布到控制器的(http post)。我期望作为参数的模型是一个类。它是与其他一些类一起继承的。

public class PurchaseOrder : CreateUpdateUserInfo
    {
        public PurchaseOrder()
        {
            this.Purchase_Order_Items = new List<clsItem>();
        }

        public int purchase_order_id { get; set; }
        public Nullable<int> purchase_quotation_id { get; set; }
        public int supplier_id { get; set; }
        public decimal flat_discount { get; set; }
        public decimal total { get; set; }
        public decimal net_payable { get; set; }
        public bool is_payment_complete { get; set; }
        public decimal sales_tax { get; set; }
        public DateTime CreatedOn { get; set; }
        public int CreatorUserID { get; set; }
        public DateTime UpdatedOn { get; set; }
        public int UpdatorUserID { get; set; }
        public bool IsDeleted { get; set; }
        public List<clsItem> Purchase_Order_Items { get; set; }
    }

 public class CreateUpdateUserInfo
    {
        public DateTime CreatedOn { get; set; }
        public int CreatorUserID { get; set; }
        public string CreatorUserName { get; set; }
        public DateTime UpdatedOn { get; set; }
        public int UpdatorUserID { get; set; }
        public string UpdatorUserName { get; set; }
        public bool IsDeleted { get; set; }
    }

并鉴于

                var model = {
                supplier_id : isNaN($scope.supplierID) || 0 ? null : $scope.supplierID,
                flat_discount : 0,
                total : $scope.total,
                net_payable :  $scope.total,
                is_payment_complete :  true,
                sales_tax:0,
                Purchase_Order_Item: $scope.items
            };
            var obj = {
                method: 'POST',
                url: 'Purchase/SaveOrder',
                dataType: 'json',
                data: JSON.stringify(model),
                headers: { "Content-Type": "application/json" }
            };

            var request = $rootScope.AjaxRequest(obj);
            request.then(function (response) {
                var isError = response.data.MessageType === 1;
                $rootScope.bindToaster(response.data.MessageType,response.data.Message);
                //$('html, body').animate({ scrollTop: 0 }, 'slow');
                if(!isError){
                    //$scope.supplierID =undefined;
                }
            }, function (response) {
                $rootScope.bindToaster(2,response.data);
                console.log(response);
            });

只需从PurchaseOrder类中删除重复的字段,它就像一个魅力。


0

我有同样的错误。当我检查代码时,我发现在我的有角(字体末端)一侧声明“ GET”请求,并在ASP.net(后端)一侧声明“ POST”请求。在两侧都设置POST / GET。然后解决了错误。


0

我面临类似的例外。检查所有列的标题名称(来自数据库中的选择查询)是否与模型类中的属性名称完全匹配。


0

我在DBContext上遇到了这个问题。当我尝试在Package Manager控制台中运行更新数据库以添加迁移时出现错误:

公共虚拟IDbSet状态{get; 组; }

问题在于类型和名称相同。我将其更改为:

公共虚拟IDbSet状态{ 组; }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.