Element z tym samym kluczem został już dodany


135

Otrzymuję ten błąd za każdym razem, gdy wysyłam formularz, również metoda akcji nie jest wywoływana z tego powodu:

Element z tym samym kluczem został już dodany.

I szczegóły wyjątku:

[ArgumentException: Element z tym samym kluczem został już dodany.]
System.ThrowHelper.ThrowArgumentException (zasób ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (klucz TKey, wartość TValue, wartość logiczna) +9382923 System .Linq.Enumerable.ToDictionary (IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) +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 model obiektu) +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, ModelBindingContext bindingContext) +548
System.Web.Mvc.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContext)
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.Web.Mvc.Controre.Excute .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, tag obiektu) +54
System.Web.Mvc.Async.AsynpercResult. End (IAsyncResult asyncResult, tag obiektu) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandsRestRestRest (IHttpAsyncHandsRest38) + wynik
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, wartość logiczna i zakończonaSynchronicznie) +184

Obejrzyj stronę

<%@ 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
Musisz dodać do tego więcej kontekstu. Pokaż nam kod kontrolera i opisz dokładnie działania, które wykonujesz. Zrób trochę debugowania samodzielnie, aby Twoje pytania były bardziej szczegółowe, a nie tylko gigantyczne bryły kodu / stosu.
Chev

Sprawdziłem mój JSON, który publikowałem bardzo dokładnie i znalazłem zduplikowaną właściwość - jedną zapisaną jako CustomerID, a drugą CustomerId - przez literówkę javascript obie właściwości zostały dodane do wysyłanego JSON, więc tylko uwaga, która rozwiązała ten problem dla mnie.
AVH

Odpowiedzi:


225

Najprawdopodobniej masz model, który zawiera dwukrotnie tę samą właściwość . Być może używasz newdo ukrycia właściwości podstawowej.

Rozwiązaniem jest zastąpienie właściwości lub użycie innej nazwy.

Gdybyś udostępnił swój model, bylibyśmy w stanie opracować więcej.


16
W C # powiedzmy, jeśli masz zmienną1 i zmienną1 (zwróci błąd). Sprawdź też, czy nie ma podobnych nazw edmx (kolumna tabeli ma „CURRENCY”, a jedna z nazw właściwości nawigacji miała „Waluta”)
Robert Koch

7
@Naveen Świetnie, naprawiono! Widzę, że jak to może się skompilować, ale tutaj pojawia się błąd. W niektórych częściach struktury (w przeciwieństwie do C #) wielkość liter nie jest rozróżniana.
Aliostad

9
Czy ktoś wiedziałby, jak rozpoznać „ten sam klucz”?
ClayKaboom

1
Zacząłem to rozumieć po tym, jak majstrowałem przy niektórych modelach widoku (dodałem właściwość Id). Błąd polegał na tym, że JS już umieszczał „id” (mały identyfikator) na obiekcie w celu zarządzania interfejsem użytkownika, ale podczas przesyłania obiekt JSON miał zarówno właściwości „Id”, jak i „id”, które są mapowane na ten sam klucz w Spinacz modelu ASP.NET, stąd ten błąd.
Svend

1
PS: jest to dozwolone w MVC3, ale nie w MVC5. Nie wiem, dlaczego zostało to zmienione.
Julian

20

Miałem ten sam problem i tak go rozwiązałem. Miałem zduplikowaną właściwość o tej samej nazwie w moim ViewModel. Jedna właściwość była w BaseViewModel, a druga w modelu pochodnym.

public class BaseviewModel{
  public int UserId { get; set; }
}


 public class Model : BaseViewModel
 {
     public int UserId { get; set; }
 }

Zmieniłem to na

public class BaseviewModel{
   public int UserId { get; set; }
}


public class Model : BaseViewModel
{
    public int User_Id { get; set; }
}

Teraz działa dobrze.


Dzięki, tylko szybkie fyi, dzieje się tak również, nawet jeśli baza i model mają tę samą nazwę atrybutu z różnymi przypadkami, np. Podstawa: Użytkownik, Model: użytkownik
Richard Housham

12

Miałem podobny problem i stwierdziłem, że to dlatego, że miałem podobnie nazwaną własność publiczną (która powinna być prywatna), która różniła się tylko w przypadku.

public string PropertyName {get;set;} // actually set propertyName, get propertyName
public string propertyName {get;set;}

powinien był być

public string PropertyName {get;set;} 
private string propertyName {get;set;}

12

Miałem 2 takie właściwości modelu

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

dziwne że wyrzucił ten błąd za te 2 haha ​​..


6

Miałem problem nie w moim modelu C #, ale w obiekcie javascript, który publikowałem za pomocą AJAX. Używam Angular do wiązania i miałem Notesna stronie pole pisane wielką literą, podczas gdy mój obiekt C # oczekiwał małych liter notes. Bardziej opisowy błąd z pewnością byłby miły.

DO#:

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

Angular / Javascript:

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

2
To nieco inna odpowiedź, żadna z moich klas C # nie ma zduplikowanych właściwości z różnymi przypadkami, ale JSON, który był wysyłany do mojego kontrolera, tak. Pomyślałem, że może się to przydać, gdy inne osoby szukają tego samego problemu, jeśli nie mogą znaleźć problemu w swoim kodzie C #.
Jason Goemaat,

To samo co Goematt. Wysyłany obiekt JSON miał zduplikowane nazwy, mimo że obiekt C #, z którym się wiązałem, całkowicie ignorował te klucze, nadal nie powiodło się. To głupie, może nawet błąd w mojej głowie. Nie kontroluję wysyłanego obiektu JSON, więc nie mogę uwzględnić wszystkich dodatkowych pól, które są wysyłane.
kukabuka

5

Miałem ten sam problem, foreachzapętlałem mój obiekt i dodawałem wynik do Dictionary<string, string>a i miałem `` Duplikat w kluczu z bazy danych

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

        }

item.x miał zduplikowaną wartość


3

Znalazłem odpowiedź - to z powodu zmiennych. Jak int a i string a. były dwie zmienne o tej samej nazwie.


1

Oto, co zrobiłem, aby znaleźć klucz, który był dodawany dwukrotnie. Pobrałem kod źródłowy z http://referencesource.microsoft.com/DotNetReferenceSource.zip i skonfigurowałem VS, aby debugować źródło struktury. Otwarty Dictionary.cs w VS uruchomił projekt, po załadowaniu strony, dodał debugowanie w wierszu ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);i był w stanie zobaczyć wartość klucza. Zdałem sobie sprawę, że w JSON jedna litera zmiennej była duża, ale w moim modelu była to mała litera. Naprawiłem model i teraz ten sam kod działa.


1

Trafiłem w to w MVC 5 i Visual Studio Express 2013. Miałem dwie właściwości z IndexAttributepodobnymi poniżej. Skomentowanie jednego z nich i ponowna kompilacja spowodowało utworzenie szkieletu kontrolera MVC 5 z widokami przy użyciu Entity Framework. Co tajemnicze, kiedy odkomentowałem atrybut, skompilowałem go i spróbowałem jeszcze raz, rusztowanie działało dobrze.

Być może bazowy model danych encji lub „coś” został zapisany w pamięci podręcznej / uszkodzony, a usunięcie i ponowne dodanie po IndexAttributeprostu spowodowało odbudowę tego „czegoś”.

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

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

1

W MVC 5 odkryłem, że tymczasowe wykomentowanie odniesień do modelu Entity Framework i ponowna kompilacja strony projektu spowodowały ten błąd podczas tworzenia szkieletu. Gdy skończę rusztowanie, odkomentowuję kod.

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

1

Chciałbym dodać odpowiedź, której tutaj nie widzę. Jest to bardzo związane z zaakceptowaną odpowiedzią, jednak nie miałem zduplikowanych właściwości w moim modelu, był to problem z moim Javascriptem.

Robiłem zapis Ajax, gdzie przebudowywałem model, aby wysłać go z powrotem na serwer. Kiedy po raz pierwszy zainicjowałem stronę, ustawiłem mój oryginalny model na zmienną:

var currentModel = result.Data;

Mój result.Datama właściwość:result.Data.Items

Więc jakiś czas później robię kilka rzeczy i chcę oszczędzać przez Ajax. Część procesu polega na pobraniu tablicy z jakiegoś procesu pobocznego i ustawieniu jej na mycurrentModel.Items właściwość i wysłaniu currentModelna serwer.

Jednak w moim JavaScript zrobiłem to, zamiast tego:

currentModel.items = getData();

Nie złapałem tego, ale w Visual Studio automatycznie zamieni pierwszą literę na małą literę dla właściwości Javascript (może to być również rzecz ReSharper). Następnie otrzymałem dokładny błąd opublikowany przez OP, kiedy próbowałem zapisać, ponieważ currentModel ma terazcurrentModel.items ANDcurrentModel.Items

Prosta zmiana z „przedmiotów” na „Przedmioty” rozwiązała problem.


1

Mój problem polegał na tym, że miałem @ Url.Action i dwukrotnie wysłałem wartość dla tej samej właściwości


1

W moim przypadku po prostu kompilacja kodu działa dobrze. Jednak wywołanie jednego ze statycznych pól klasy statycznej, która ma słownik, taki jak przykładowy kod, zgłasza wyjątek.

Przykładowy kod

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

Objaśnienie ADict ma dwukrotnie dodany klucz „test”. Tak więc, gdy wywołujesz klasę statyczną, zgłasza wyjątek.


0

Miałem ten sam problem. Pojawiło się to po migracji do MVC 5 z MVC 3.

Miałem niestandardowy szablon edytora i musiałem go wcześniej używać w następujący sposób:

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

Aby rozwiązać problem, musiałem usunąć przechodzący ViewDataobiekt. Więc na koniec miałem:

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

Mam nadzieję, że to pomoże.


0

Miałem ten sam błąd. A po tym, jak już pomyślałem, że mój umysł jest zepsuty, ponieważ zmieniłem nazwę prawie wszystkich właściwości moich modeli, rozwiązaniem było usunięcie jednego odniesienia ze wszystkich kontrolek Syncfusion i dodanie odniesień do poszczególnych kontrolek tych kontrolek. (Od Nuget)


0

W moim przypadku źródłem problemu była zduplikowana nazwa właściwości w pliku json klienta, która różniła się tylko rozróżnianiem wielkości liter.


0

Innym sposobem napotkania tego błędu jest skorzystanie ze zbioru danych z nienazwanymi kolumnami . Błąd jest generowany, gdy zestaw danych jest serializowany do formatu JSON.

To stwierdzenie spowoduje błąd:

select @column1, @column2

Dodanie nazw kolumn zapobiegnie wystąpieniu błędu:

select @column1 as col1, @column2 as col2

0

Miałem ten sam błąd, ale b / c przyczyny diff. Korzystanie z Entity Framework. Jeszcze jedna rzecz, którą muszę tutaj dodać, zanim udostępnię mój kod i rozwiązanie, miałem punkt przerwania w metodzie kontrolera, ale tam nie było, po prostu wyrzucałem wewnętrzny błąd serwera wyjątku 500.

Wysyłałem dane z widoku do kontrolera przez ajax (post http). Model, którego oczekiwałem jako parametr, był klasą. Został odziedziczony z inną klasą.

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

i na widoku

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

Po prostu usunąłem zduplikowane pola z klasy PurchaseOrder i działało to jak urok.


0

Miałem ten sam błąd. Kiedy sprawdzam kod, stwierdziłem, że deklaruję żądanie „GET” po stronie kątowej (koniec czcionki) i deklaruję żądanie „POST” po stronie ASP.net (zaplecza). Ustaw POST / GET po obu stronach. Następnie rozwiązano błąd.


0

Miałem podobny wyjątek. Sprawdź, czy wszystkie kolumny mają nazwy nagłówków (z zapytania wybierającego w bazie danych) z dokładnie pasującymi nazwami właściwości w klasie modelu.


0

Miałem ten problem na DBContext. Wystąpił błąd, gdy próbowałem uruchomić bazę danych aktualizacji w konsoli Menedżera pakietów, aby dodać migrację:

public virtual IDbSet Status {get; zestaw; }

Problem polegał na tym, że typ i nazwa były takie same. Zmieniłem to na:

publiczne wirtualne statusy IDbSet {get; zestaw; }

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.