Елемент з тим самим ключем уже додано


135

Я отримую цю помилку щоразу, коли я надсилаю форму, і спосіб дії не викликається через це:

Елемент з тим самим ключем уже додано.

Деталі про виняток:

[ArgumentException: Елемент з тим самим ключем уже додано.]
System.ThrowHelper.ThrowArgumentException (ресурс ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (клавіша TKey, значення TValue, булева добавка) +9382923 Система .Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 порівняння) +252
System.Linq.Eumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, IE'quomC компаратор) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata () +228 System.Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContextindingContext, PropertyDescriptor властивістьDescriptor) +39
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 КонтролерContext, ModelBindingContext прив'язкаContext) +2504
System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext прив'язкаContext) +548
System.Web.Mvc.ControllerActionInvoker.GetPetxtonmeter Parameter (ПараметрCetTermeter Parameter)
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(контролер ControllerContextContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (контролер ControllerActionInvoker.InvokeAction (контролер ControllerActionInvoker.InvokeAction (ControllerContext ControllerContext, String action.ame). .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. Кінець (IAsyncResult asyncResult, тег об’єкта) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndAultProncRequest (результат) Результат
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (крок IExecutionStep, булевий і завершений синхронно) +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>
      <%} %>


2
Вам потрібно додати більше контексту для цього. Покажіть нам код контролера та опишіть точні дії, які ви вживаєте. Зробіть невелику налагодження самостійно, щоб ваші питання були більш багатослівними, а не просто гігантськими грудками коду / стека.
Шев

Я перевірив свій JSON, який надсилаю дуже близько, і виявив, що дублікат властивості - один написаний CustomerID і один написаний CustomerId - через типовий javascript, обидва властивості були додані до JSON, який я публікував, так що просто голова, який вирішив цю проблему для я.
AVH

Відповіді:


225

Швидше за все , у вас є модель, яка містить одну і ту ж властивість двічі . Можливо, ви використовуєте newдля приховування базової властивості.

Рішенням є перекриття властивості або використання іншого імені.

Якщо ви поділитеся своєю моделлю, ми зможемо розробити більше.


16
Скажімо, у C #, якщо у вас є змінний1 та Змінна1 (це призведе до помилки). Також перевірте, чи немає подібних назв edmx (у стовпці таблиці "CURRENCY", одна з назв навігаційних властивостей мала "Валюта")
Роберт Кох

7
@Naveen Чудово це виправлено! Я бачу, що як це могло скластись, але тут викидають помилки. Деякі частини фреймворку (на відміну від C #) нечутливі до регістру.
Аліостад

9
Хтось би знав, як визначити, який "той самий ключ"?
ClayKaboom

1
Я почав отримувати це після того, як познайомився з деякими моделями перегляду (додав властивість Id). Помилка полягала в тому, що JS вже ставив "id" (малий ідентифікатор) на об'єкт для деякого управління користувальницьким інтерфейсом, але під час подання об'єкт JSON мав як "Id", так і "id", які відображають один і той же ключ у Пов’язка моделі ASP.NET, звідси і ця помилка.
Svend

1
PS: це дозволено в MVC3, але не в MVC5. Не знаю, чому це було змінено.
Джуліан

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

Зараз це працює чудово.


Дякую, просто швидкий фій, це також відбувається, навіть якщо база та модель мають однакову назву атрибута з різним регістром, наприклад, База: Користувач, Модель: користувач
Річард Хоушам,

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


6

У мене була проблема не в моїй моделі C #, а в об'єкті JavaScript, який я розміщував за допомогою AJAX. Я використовую Angular для прив’язки, і Notesна сторінці було написано великі літери, тоді як мій об’єкт C # очікував малі регістри notes. Більше описової помилки, безумовно, було б добре.

C #:

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

Кутовий / Javascript:

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

2
Це дещо інша відповідь, жоден з моїх класів C # не має дублюючих властивостей у різних випадках, але JSON, який надсилався моєму контролеру, так і зробив. Думав, що це може стати в нагоді іншим людям, які шукають ту саму проблему, якщо вони не зможуть знайти проблему у своєму C # коді ..
Jason Goemaat

Те саме, що і Goematt. Об'єкт JSON, який надсилався, мав повторювані імена, хоча об'єкт c #, до якого я прив'язував, повністю ігнорував ці ключі, він все ще не вдавався. Це німий, може, навіть помилка в моїй свідомості. Я не контролюю об'єкт JSON, що надсилається, тому не можу пояснити, які всі додаткові поля надсилаються.
kukabuka

5

У мене був той самий випуск, я foreachперекидався на мій об’єкт і додавав результат у a, Dictionary<string, string>і у мене був `Дублікат ключа в базі даних

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

        }

item.x мав подвійне значення


3

Я знайшов відповідь. Це було через змінні. Як int a і string a було дві змінні з однаковою назвою.


1

Ось що я зробив, щоб дізнатися ключ, який додавали двічі. Я завантажив вихідний код з http://referencesource.microsoft.com/DotNetReferenceSource.zip та встановив VS для налагодження рамкового джерела. Відкритий Dictionary.cs у VS запустив проект, як тільки завантажується сторінка, додається налагодження у рядку ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);та змогли побачити значення "ключ". Я зрозумів, що в JSON одна буква змінної є великою літерою, але в моїй моделі це є малою літерою. Я виправив модель і тепер працює той самий код.


1

Я потрапив до цього в MVC 5 та Visual Studio Express 2013. У мене було два властивості, IndexAttributeяк нижче. Коментування однієї з них та перекомпіляція призвели до того, що контролер MVC 5 переглянув перегляди, використовуючи успіх Entity Framework. Таємниче, коли я прокоментував атрибут, перекомпілював і спробував ще раз, риштування вийшло просто чудово.

Можливо, основна модель даних сутності або "щось" було кешоване / пошкоджене, а видалення та повторне додавання 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). Потім я отримав точну помилку, яку опублікував ОП, коли я намагався зберегти, тому що в 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 5 з MVC 3.

У мене був власний шаблон редактора, і я мав його використовувати так раніше:

@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 різної причини. Використання структури Entity. Ще одну річ, яку мені потрібно додати тут, перш ніж поділитися кодом і рішенням, у мене був метод перерви на методі контролера, але він там не був порушений, просто кинув виняток 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" запит у моїй кутовій (шрифтовій) стороні та оголошує "POST" запит на стороні ASP.net (бек-енд). Встановіть POST / GET будь-яку з обох сторін. Потім вирішили помилку.


0

Я зіткнувся з подібним винятком. Перевірте, чи всі стовпці мають назви заголовків (із запиту вибору у базі даних) із точно узгодженими іменами властивостей у модельному класі.


0

У мене виникла ця проблема в DBContext. Отримав помилку, коли я спробував запустити базу даних оновлень у консолі Package Manager, щоб додати міграцію:

загальнодоступний віртуальний статус IDbSet {get; набір; }

Проблема полягала в тому, що тип і назва були однаковими. Я змінив його на:

публічні віртуальні статуси IDbSet {get; набір; }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.