已添加具有相同键的项

每当我提交表单时,我都会收到这个错误,而且 action 方法也没有被调用,因为:

已添加具有相同键的项。

还有例外的细节:

[ ArgumentException: 具有 已经添加了相同的密钥。]
System.ThrowHelper.ThrowArgumentException (ExceptionResource + 52
系统。集合。通用。字典‘2。插入(TKey 键、 TValue 值、 Boolean add) + 9382923 System. Linq. Enumerable.ToDictionary (IEnumable‘1 源代码,Func‘2 keySelector,Func‘2 ElementSelector,IEqualityComparer‘1 + 252
System.Linq.Enumerable.ToDictionary (IEnumerable‘1 来源,Func‘2 keySelector, 比较器’1比较器) + 91
System.Web.Mvc.ModelBindingContext.get _ PropertyMetadata () + 228 System. Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext 模型绑定上下文 BindingContext,PropertyDescriptor PropertyDescriptor) + 392
DefaultModelBinder.BindProperties (ControllerContext 模型绑定上下文 + 147
DefaultModelBinder.BindComplexElementalModel (ControllerContext 模型绑定上下文 BindingContext,对象模型) + 98
DefaultModelBinder.BindComplexModel (ControllerContext 模型绑定上下文 + 2504
DefaultModelBinder.BindModel (ControllerContext 模型绑定上下文 + 548
System.Web.Mvc.ControllerActionInvoker 参数描述符 参数描述符) + 473
System.Web.Mvc.ControllerActionInvoker 控制器上下文,动作描述符 ActionDescriptor) + 181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext 控制器上下文,字符串操作名称) + 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 Object 标记) + 54
系统。 Web。 Mvc.Async.AsyncResultWrapper. End (IAsyncResult Object 标记) + 40
System.Web.Mvc.MvcHandler. EndProcessRequest (IAsyncResult + 52
System.Web.IHttpAsyncHandler. EndProcessRequest (IAsyncResult 结果) + 38
System.Web.CallHandlerExectionStep.System.Web.HttpApplication.IExectionStep.Execute () + 8836913 System. Web.HttpApplication.ExecuteStep (IExectionStep 步骤、布尔值及同步完成) + 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>
<%} %>

523175 次浏览

最有可能的是 ,您有哪个 包含相同的属性两次模型。也许您正在使用 new来隐藏基本属性。

解决方案是重写属性或使用其他名称。

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

我找到了答案,是因为变量。就像 int a 和 string a 一样,有两个名字相同的变量。

我也遇到过同样的问题,我就是这样解决的。我的 ViewModel 中有一个名称相同的重复属性。一个属性位于 BaseViewModel 中,另一个属性位于派生的 Model 中。

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

现在一切正常。

我也遇到过类似的问题,我发现这是因为我有一个类似名称的公共财产(应该是私有的) ,只有在不同的情况下才会有所不同。

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

我有两个这样的模型属性

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

奇怪的是,它为这两个人抛出了这个错误,哈哈... ..。

我有同样的问题,我是 foreach循环我的对象,并添加到一个 Dictionary<string, string>的结果,我有一个’重复的关键从数据库

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


}

item.x有一个重复的值

问题不在我的 C # 模型中,而在我使用 AJAX 发布的 javascript 对象中。我使用 Angular 进行绑定,在页面上有一个大写的 Notes字段,而我的 C # 对象需要小写的 notes。一个更具描述性的错误当然很好。

C # :

class Post {
public string notes { get; set; }
}

Angular/Javascript:

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

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

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

在 MVC 5中,我发现临时注释掉对实体框架模型的引用,并在搭建脚手架时重新编译项目端避免了这个错误。一旦我完成脚手架,我取消注释的代码。

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

我想补充一个我在这里看不到的答案。这是非常相关的接受的答案,但是,我没有重复属性对我的模型,这是一个问题与我的 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

一个简单的从“项目”到“项目”的改变就解决了这个问题。

我的问题是我有一个@Url。操作和我通过同一属性的值发送了两次

我也有同样的问题,在从 MVC3迁移到 MVC5之后就出现了。

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

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

为了解决这个问题,我必须移除传递的 ViewData对象:

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

希望能有帮助。

我也犯过同样的错误。在我已经认为我的思想是破碎的,因为我已经重命名几乎所有的模型属性的解决方案是删除所有同步控件上的一个引用,并添加到这个控件的个别控件的引用。(来自 Nuget)

在我的案例中,问题的根源在于客户端 json 中的重复属性名,这只是大小写敏感性不同而已。

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

这种说法将导致错误:

select @column1, @column2

添加列名将防止出现错误:

select @column1 as col1, @column2 as col2

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

我通过 ajax 将数据从 view 发布到 controller (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 类中删除重复的字段,就可以轻松实现。

在我的例子中,只要编译代码,它就可以正常运行。但是如果调用具有类似示例代码的字典的静态类的静态字段之一,则会引发异常。

样本代码

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

解释 ADict 添加了两次“ test”键。因此,当您调用静态类时,它会抛出异常。

我也犯过同样的错误。当我检查代码的时候,我发现在我的角(字体末端)端声明“ GET”请求,在 ASP.net (后端)端声明“ POST”请求。在两边设置 POST/GET 任意一个。然后解决了错误。

我也遇到过类似的例外。检查所有列是否具有与模型类中的属性名完全匹配的头名(来自数据库中的选择查询)。

我在 DBContext 上有这个问题。 当我尝试在 Package Manager 控制台中运行 update-database 以添加迁移时,出现了错误:

Public 虚拟 IDbSet Status { get; set; }

问题是类型和名称是相同的。 我改成了:

Public 虚拟 IDbSet 状态{ get; set; }

我有这个确切的错误,不是因为属性名,而是因为有重复的自定义属性值。

class Person {
[Column("first_name")]
public string FirstName { get; set; }


[Column("first_name"]  // I forgot to change the custom attribute value
public string LastName { get; set; }


public static IEnumerable<Name> Names = db.Query<Name>(""); // error
}

2021年3月

Dotnetfiddle演示

在我的例子中,字典中的 key是重复的。 enter image description here

在我的例子中,这是因为我在 for 中使用了 JoinAlias。

            foreach (ISearchSpecsFilter item in searchFilter.SpecsFilter) {


if (item.MinValue + item.MinValue != 0) {


result = result
.WithSubquery
.WhereExists(
workDetailEntity
.JoinAlias(j => j.WorkDetailLabel, () => workDetailLabelEntity)
.JoinAlias(j => workDetailLabelEntity.WorkLabel, () => workLabelEntity)
.JoinAlias(j => workDetailLabelEntity.WorkUnitMeasureType, () => workUnitMeasureTypeEntity)
.Where(w => w.Work.WorkId == workEntity.WorkId && w.Value >= item.MinValue && w.Value <= item.MaxValue && workLabelEntity.WorkLabelId == item.WorkLabelId && workUnitMeasureTypeEntity.WorkUnitMeasureTypeId == (int)item.WorkUnitMeasure)
.Select(s => s.Work.WorkId)
);


}


}

我在执行一个 Stord 过程时遇到了同样的问题,并且返回了两个具有相同名称的列。在模型类中映射该列时,存在冲突。要解决这个问题,请始终对返回的列使用唯一的名称。