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

问题描述

每当我提交表单时,都会收到此错误,并且由于以下原因未调用action方法:   具有相同键的项目已被添加。 以及异常详细信息:   [ArgumentException:带有   相同的密钥已被添加。]   System.ThrowHelper.ThrowArgumentException(ExceptionResource   资源)+52   System.Collections.Generic.Dictionary`2.Insert(TKey   键,TValue值,布尔值添加)   +9382923 System.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,字符串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,对象标记)+54   System.Web.Mvc.Async.AsyncResultWrapper.End(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>
      <%} %>
    

解决方法

您最有可能拥有两次包含相同属性的模型。也许您正在使用ѭ1来隐藏基本属性。 解决方案是覆盖属性或使用其他名称。 如果您共享您的模型,我们将能够详细说明。     ,我遇到了同样的问题,这就是我解决的方法。我的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; }
}
现在工作正常。     ,我有一个类似的问题,发现这是因为我有一个类似命名的公共财产(应该是私有的),只是大小写有所不同。
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;}
    ,我有2个这样的模型属性
public int LinkId {get;set;}
public int LinkID {get;set;}
奇怪的是,这两个哈哈引发了这个错误。     ,我的问题不在我的C#模型中,而在我使用AJAX发布的javascript对象中。我使用Angular进行绑定,并且页面上有一个大写的
Notes
字段,而我的C#对象期望使用小写的
notes
。一个更具描述性的错误肯定会很好。 C#:
class Post {
    public string notes { get; set; }
}
Angular / Javascript:
<input ng-model=\"post.Notes\" type=\"text\">
    ,我找到了答案,这是因为变量。像int和字符串a。有两个同名变量。     ,我遇到了同样的问题,我在对象上循环了
foreach
,然后将结果添加到了
Dictionary<string,string>
中,并且数据库中的键重复了。
 foreach (var item in myObject)
        {
            myDictionary.Add(Convert.ToString(item.x),item.y);

        }
item.x
具有重复值     ,这是我做的工作,目的是找出两次被添加的密钥。我从http://referencesource.microsoft.com/DotNetReferenceSource.zip下载了源代码,并设置了VS以调试框架源。在VS中打开Dictionary.cs来运行项目,页面加载后,在第15行添加了调试,并能够看到\'key \'值。我意识到在JSON中,变量的一个字母为大写字母,但在我的模型中为小写字母。我修复了模型,现在相同的代码起作用了。     ,我在MVC 5和Visual Studio Express 2013中实现了这一点。我有两个属性,分别为
IndexAttribute
,如下所示。注释掉其中之一并重新编译后,将成功使用Entity Framework为MVC 5控制器提供视图。奇怪的是,当我取消注释该属性,重新编译并再次尝试时,脚手架运行得很好。 可能底层的实体数据模型或“某物”已被缓存/损坏,删除并重新添加“ 16”只是触发了该“物”的重建。
[Index(IsUnique = true)]
public string Thing1 { get; set; }

[Index(IsUnique = true)]
public string Thing2 { get; set; }
    ,在MVC 5中,我发现暂时注释掉对Entity Framework模型的引用,并在脚手架时重新编译项目侧会导致此错误。一旦完成脚手架,我便不会注释代码。
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
拥有财产::22ѭ 因此,一段时间后,我做了一些事情,并希望通过Ajax保存。该过程的一部分是从某个过程中获取一个数组,并将其设置为我的
currentModel.Items
属性,然后将
currentModel
发送到服务器。 但是,在我的Javascript中,我这样做是:
currentModel.items = getData();
我没听懂,但是在Visual Studio中,它将自动小写Javascript属性的首字母(这也可能是ReSharper的东西)。然后,我尝试保存时得到了OP发布的确切错误,因为currentModel现在有
currentModel.items
currentModel.Items
从\“ items \”更改为\“ Items \”的简单更改解决了该问题。     ,我的问题是我有一个@ Url.Action,并且两次通过同一属性的值发送     ,我有同样的问题。从MVC 3迁移到MVC 5后,它似乎对我而言。 我有自定义编辑器模板,之前必须像这样使用它:
@Html.EditorFor(model => model.MyProperty,\"MyCustomTemplateName\",\"MyPropertyField\",this.ViewData)
要解决此问题,我必须删除传递的“ 29”对象。所以最后我有了:
@Html.EditorFor(model => model.MyProperty,\"MyPropertyField\")
希望能帮助到你。     ,我有同样的错误。在我已经确定自己的想法已经崩溃之后,因为我已经重命名了几乎所有的模型属性,所以解决方案是删除“所有Syncfusion控件”上的一个引用,并为该控件的各个控件添加引用。 (来自Nuget)     ,就我而言,问题的根源是客户端json中的重复属性名称,只是区分大小写而有所不同。     ,遇到此错误的另一种方法是来自具有未命名列的数据集。将数据集序列化为JSON时会引发错误。 此语句将导致错误:
select @column1,@column2
添加列名将防止错误:
select @column1 as col1,@column2 as col2
    ,我有相同的错误,但差异原因是b / c。使用实体框架。在共享我的代码和解决方案之前,我还需要在这里添加一件事,我在控制器方法上有一个断点,但是它并没有中断,只是抛出了异常500内部服务器错误。 我正在通过ajax将数据从视图发布到控制器(http发布)。我期望作为参数的模型是一个类。它是与其他一些类一起继承的。
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已两次添加“测试”键。因此,当您调用静态类时,它将引发异常。     ,我有同样的错误。当我检查代码时,我发现在我的有角(字体端)一侧声明了“ GET”请求,并在ASP.net(后端)侧声明了“ POST”请求。在两侧都设置POST / GET。然后解决了错误。