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

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

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

И сведения об исключении:

[ArgumentException: элемент с тот же ключ уже добавлен.]
System.ThrowHelper.ThrowArgumentException(ExceptionResource ресурс) +52
System.Collections.Generic.Dictionary`2.Insert(TKey ключ, значение TValue, Boolean add) +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) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata() +228 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor свойствоDescriptor) +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, тег объекта) +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 step, Boolean & 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>
      <%} %>

Ответ 1

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

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

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

Ответ 2

У меня была такая же проблема, и я решил это. У меня было двойное свойство с тем же именем в моей модели 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; }
}

Теперь он работает нормально.

Ответ 3

У меня была аналогичная проблема, и я обнаружил, что это связано с тем, что у меня было аналогичное публичное свойство (которое должно было быть частным), которое только отличалось в случае.

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

Ответ 4

У меня было 2 свойства модели, подобные этому

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

Странно, что он выбросил эту ошибку для этих двух ха-ха..

Ответ 5

У меня была проблема не в моей модели С#, а в объекте javascript, который я отправлял с помощью AJAX. Я использую Angular для привязки и имел заглавное поле Notes на странице, а мой объект С# ожидал нижний регистр Notes. Более описательная ошибка будет приятной.

С#:

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

Angular/JavaScript:

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

Ответ 6

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

Ответ 7

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

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

        }

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

Ответ 8

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

Ответ 9

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

Ответ 10

Я попал в это в MVC 5 и Visual Studio Express 2013. У меня было два свойства с IndexAttribute, как показано ниже. Комментируя один из них и перекомпилировав, выстроили в лесу контроллер MVC 5 с представлениями, используя Entity Framework. Загадочно, когда я раскоментировал атрибут, перекомпилировал и снова попытался, scaffolder работал нормально.

Возможно, базовая модель данных сущностей или "что-то" была кэширована/повреждена, а удаление и повторное добавление IndexAttribute просто вызвало перестроение этого "чего-то".

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

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

Ответ 11

В MVC 5 я обнаружил, что временно комментирует ссылки на модель Entity Framework и перекомпилирует сторону проекта, выполнив эту ошибку при создании лесов. Как только я закончу строительные леса, я раскомментирую код.

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

Ответ 12

Я хотел бы добавить ответ, который я не вижу здесь. Это очень связано с принятым ответом, однако у меня не было дублированных свойств на моей модели, это была проблема с моим Javascript.

Я делал некоторое спасение Ajax, где я перестраивал модель для отправки обратно на сервер. Когда я сначала инициализировал страницу, я установил свою исходную модель в переменную:

var currentModel = result.Data;

My result.Data имеет свойство: result.Data.Items

Итак, через некоторое время я кое-что делаю и хочу сэкономить через Ajax. Часть процесса состоит в том, чтобы захватить массив из некоторого побочного процесса и установить его в мое свойство currentModel.Items и отправить currentModel на сервер.

В моем Javascript, однако, я сделал это, вместо этого:

currentModel.items = getData();

Я не поймал его, но в Visual Studio он автоматически запустит первую букву для свойств Javascript (это тоже может быть ReSharper). Затем я получил точную ошибку, отправленную OP при попытке сохранить, поскольку currentModel теперь имеет currentModel.Items И currentModel.Items

Простая замена "пунктов" на "Элементы" устраняет проблему.

Ответ 13

У меня была такая же проблема. Он появился для меня после перехода на MVC 5 из MVC 3.

У меня был пользовательский шаблон редактора и ему пришлось использовать его так:

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

Чтобы решить проблему, мне пришлось удалить проходящий объект ViewData. Поэтому в конце я имел:

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

Надеюсь, что это поможет.

Ответ 14

У меня была такая же ошибка. И после того, как я уже думал, что мой ум сломан, потому что я переименовал почти все свойства моих моделей, решение было удалить одну ссылку на All Syncfusion Controls и добавить ссылки на отдельные элементы управления этого элемента управления. (От Nuget)

Ответ 15

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

Ответ 16

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

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

select @column1, @column2

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

select @column1 as col1, @column2 as col2

Ответ 17

У меня была такая же ошибка, но б/с по разным причинам. Использование 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, и это сработало как прелесть.

Ответ 18

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

Образец кода

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

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

Ответ 19

У меня была такая же ошибка. Когда я проверил код, я обнаружил, что объявляю запрос "GET" на моей угловой стороне (font-end) и объявляю запрос "POST" на стороне ASP.net(back-end). Установите POST/GET любой в обе стороны. Затем решил ошибку.