已添加具有相同键的项目

时间:2011-04-13 10:59:57

标签: asp.net-mvc

每当我提交表单时都会收到此错误,因为这样就没有调用action方法:

  

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

异常细节:

  

[ArgumentException:带有。的项目   已添加相同的密钥。]
  System.ThrowHelper.ThrowArgumentException(ExceptionResource   资源)+52
  System.Collections.Generic.Dictionary`2.Insert(TKEY的   key,TValue值,布尔加法)   +9382923 System.Linq.Enumerable.ToDictionary(IEnumerable`1   source,Func`2 keySelector,Func`2   elementSelector,IEqualityComparer`1   比较)+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的   结果)+38
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +8836913 System.Web.HttpApplication.ExecuteStep(IExecutionStep   步,布尔& 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>
      <%} %>

24 个答案:

答案 0 :(得分:198)

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

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

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

答案 1 :(得分:19)

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

现在工作正常。

答案 2 :(得分: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;}

答案 3 :(得分:11)

我有2个这样的模型属性

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

奇怪的是它为这2个哈哈投掷了这个错误..

答案 4 :(得分:6)

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

C#:

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

角/使用Javascript:

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

答案 5 :(得分:3)

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

答案 6 :(得分:3)

我有同样的问题,我foreach循环我的对象并将结果添加到Dictionary<string, string>中,我在数据库的密钥中有一个副本

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

        }

item.x有重复值

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

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

答案 9 :(得分: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.items AND currentModel.Items

&#34;项目&#34;的简单更改到&#34;项目&#34;解决了这个问题。

答案 10 :(得分:1)

我在MVC 5和Visual Studio Express 2013中看到了这个。我有两个属性IndexAttribute,如下所示。注释掉其中一个并重新编译导致使用实体框架成功构建具有视图的MVC 5控制器。神奇的是,当我取消注释属性,重新编译并再次尝试时,脚手架运行得很好。

也许是基础实体数据模型或&#34;某事物&#34;已被缓存/损坏,删除并重新添加IndexAttribute只会触发重建#34;

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

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

答案 11 :(得分:1)

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

答案 12 :(得分:0)

就我而言,这是因为我在 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)
                        );

                }

            }

答案 13 :(得分:0)

2021 年 - 3 月

dotnetfiddle 上的演示

就我而言,字典中的 key 是重复的。 enter image description here

答案 14 :(得分:0)

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

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
}

答案 15 :(得分:0)

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

公共虚拟IDbSet状态{组; }

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

公共虚拟IDbSet状态{组; }

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

示例代码

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

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

答案 19 :(得分:0)

我有相同的错误,但差异原因是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类中删除重复的字段,它就像一个超级按钮。

答案 20 :(得分:0)

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

此声明将导致错误:

select @column1, @column2

添加列名可以防止错误:

select @column1 as col1, @column2 as col2

答案 21 :(得分:0)

在我的情况下,问题的根源是客户端json中的重复属性名称,只是区分大小写。

答案 22 :(得分:0)

我遇到了同样的错误。在我已经认为我的思想被打破之后,因为我已经重命名了几乎所有模型属性,解决方案是删除所有Syncfusion控件上的一个引用并添加对此控件的各个控件的引用。 (来自Nuget)

答案 23 :(得分:0)

我有同样的问题。从MVC 3迁移到MVC 5之后,它出现在我身上。

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

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

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

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

希望它有所帮助。