Элемент с таким же ключом уже добавлен

135

Я получаю эту ошибку всякий раз, когда я отправляю форму, и метод действия не вызывается из-за этого:

Элемент с таким же ключом уже добавлен.

И детали исключения:

[ArgumentException: элемент с тем же ключом уже добавлен.]
System.ThrowHelper.ThrowArgumentException (ресурс ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (ключ TKey, значение TValue, логическое добавление) +9382923 система .Linq.Enumerable.ToDictionary (источник IEnumerable`1, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 Comparer) +252
System.Linq.Enumerable.ToDictionary (Источник IEnumerable`1, Func`2 keySelector, IEqualityComparer Сравниватель) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata () +228 System.Web.Mvc.DefaultModelBinder.BindProperty (ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, свойствоDescriptor) +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 параметр-код сценария контекста контекста
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +rol.Mone.Control.Exvent.ControlSec.Conservice.exe (8). System.Tec2CoreControl.ec. .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. Конец (IAsyncResult asyncResult, тег объекта) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcess +Rescess + Regress
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>
      <%} %>

user650922
источник
2
Вы должны добавить больше контекста к этому. Покажите нам код контроллера и опишите точные действия, которые вы предпринимаете. Сделайте небольшую отладку самостоятельно, чтобы ваши вопросы были более многословными, а не просто гигантскими кусками кода / стека.
Chev
Я проверил свой JSON, который я публиковал очень внимательно, и обнаружил дублирующееся свойство - одно записанное CustomerID и одно записанное CustomerId - через опечатку javascript оба свойства были добавлены в JSON, который я публиковал, так что просто хедз-ап, который решил эту проблему для меня.
AVH

Ответы:

225

Скорее всего , у вас есть модель, которая содержит одно и то же свойство дважды . Возможно, вы используете, newчтобы скрыть базовое свойство.

Решение состоит в том, чтобы переопределить свойство или использовать другое имя.

Если вы поделитесь своей моделью, мы сможем разработать более подробно.

Aliostad
источник
16
Скажем, в C #, если у вас есть variable1 и Variable1 (он выдаст ошибку). Кроме того, убедитесь, что нет похожих имен edmx (столбец таблицы имеет "CURRENCY", одно из имен свойств навигации имеет значение "Валюта")
Роберт Кох
7
@ Навин Отлично, это исправлено! Я вижу, как это может скомпилироваться, но выдает ошибку здесь. Некоторые части фреймворка (в отличие от C #) не чувствительны к регистру.
Алиостад
9
Кто-нибудь знает, как определить, что такое «тот же ключ»?
ClayKaboom
1
Я начал получать это после того, как возился с некоторыми моделями представления (добавил свойство Id). Ошибка состояла в том, что JS уже помещал «id» (строчный id) в объект для некоторого управления пользовательским интерфейсом, но при отправке объект JSON имел свойства «Id» и «id», которые отображаются на один и тот же ключ в Связыватель модели ASP.NET, следовательно, эта ошибка.
Свен
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; }
}

Сейчас работает нормально.

atulpatel.mca
источник
Спасибо, просто быстрое замечание, это также происходит, даже если база и модель имеют одно и то же имя атрибута с различным регистром, например, 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;}

странно, что он выкинул эту ошибку за эти 2 хаха ..

CuriousBenjamin
источник
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 # ..
Джейсон Гоемаат
Так же, как Гоматт. Отправляемый объект JSON имел повторяющиеся имена, хотя объект c #, с которым я связывался, полностью игнорировал эти ключи, он все равно не удался. Это глупо, возможно, даже ошибка в моей голове. Я не контролирую отправляемый объект JSON, поэтому не могу учесть, что отправляются все дополнительные поля.
kukabuka
5

У меня была та же проблема, я foreachзацикливался на своем объекте и добавлял результат в a, Dictionary<string, string>и у меня был `Duplicate в ключе из базы данных

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

        }

item.x имел двойное значение

Мина Габриэль
источник
3

Я нашел ответ. Это было из-за переменных. Как int a и строка a. там были две переменные с одинаковыми именами.

user650922
источник
1

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

bvoleti
источник
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). Затем я получил точную ошибку, опубликованную OP, когда попытался сохранить, потому что currentModel теперь имеетcurrentModel.items ANDcurrentModel.Items

Простое изменение «предметов» на «Предметы» решило проблему.

JasonWilczak
источник
1

Моя проблема заключалась в том, что у меня было действие @ Url.Action, и я дважды отправил значение для одного и того же свойства

abiNerd
источник
1

В моем случае, просто когда вы компилируете код, он работает просто отлично. Но вызов одного из статического поля статического класса, имеющего словарь, подобный образцу кода, вызывает исключение.

Образец кода

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

Пояснение ADict имеет дважды добавленный ключ «test». Итак, когда вы вызываете статический класс, он выдает исключение.

Ахмет Ремзи ЭКМЕКСИ
источник
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)

AlfredBauer
источник
0

В моем случае корень проблемы заключался в дублировании имени свойства в клиентском json, которое отличалось только чувствительностью к регистру.

kubajs
источник
0

Другой способ встретить эту ошибку - это набор данных с неназванными столбцами. . Ошибка генерируется, когда набор данных сериализуется в JSON.

Это утверждение приведет к ошибке:

select @column1, @column2

Добавление имен столбцов предотвратит ошибку:

select @column1 as col1, @column2 as col2
user9375338
источник
0

У меня была такая же ошибка, но б / с по разным причинам. Использование Entity Framework. Еще одна вещь, которую я должен добавить здесь, прежде чем я поделюсь своим кодом и решением, у меня была точка останова на методе контроллера, но он не ломался там, просто выдает исключение 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» на моей угловой стороне (font-end) и объявляю запрос «POST» на стороне ASP.net (back-end). Установите POST / GET любой в обе стороны. Тогда решил ошибку.

Санджиб Дхар
источник
0

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

Викас
источник
0

У меня была эта проблема в DBContext. Возникла ошибка при попытке запустить update-database в консоли диспетчера пакетов для добавления миграции:

общедоступный виртуальный IDbSet Status {get; устанавливать; }

Проблема заключалась в том, что тип и имя были одинаковыми. Я изменил это на:

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

LuTheZy
источник