Ein Element mit demselben Schlüssel wurde bereits hinzugefügt

135

Ich erhalte diese Fehlermeldung, wenn ich das Formular abschicke. Außerdem wird die Aktionsmethode aus diesem Grund nicht aufgerufen:

Ein Element mit demselben Schlüssel wurde bereits hinzugefügt.

Und die Ausnahmedetails:

[ArgumentException: Ein Element mit demselben Schlüssel wurde bereits hinzugefügt.]
System.ThrowHelper.ThrowArgumentException (ExceptionResource-Ressource) +52
System.Collections.Generic.Dictionary`2.Insert (TKey-Schlüssel, TValue-Wert, Boolean add) +9382923 System .Linq.Enumerable.ToDictionary (IEnumerable`1-Quelle, Func`2-Schlüsselauswahl, Func`2-Elementauswahl, IEqualityComparer`1-Vergleicher) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1-Quelle, Func`2-Schlüsselauswahl, IEqualityComparer1 Vergleicher) +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 (Controllercontroller, ModelBindingContext Binding) +147
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel (Controllercontroller, ModelBindingContext Binding, Object Model) +98
System.Web.Mvc.DefaultModelBinder.BindComplexModel (Controller controllerContext, ModelBindingContext bindingContext) +2504
System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +548
System.Web.Mvc.ControllerActionInvoker.GetParameterValueContextContext,
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.We .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, Objekt-Tag) +54
System.Web.Mvc.Async.AsyncResultWrapper. Ende (IAsyncResult asyncResult, Objekt-Tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndP
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (IExecutionStep-Schritt, Boolean & completeSynchronously) +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>
      <%} %>

user650922
quelle
2
Sie müssen dem mehr Kontext hinzufügen. Zeigen Sie uns den Controller-Code und beschreiben Sie die genauen Aktionen, die Sie ausführen. Führen Sie selbst ein kleines Debugging durch, damit Ihre Fragen ausführlicher sind und nicht nur riesige Code- / Stapelklumpen.
Chev
Ich habe meinen JSON überprüft, den ich sehr genau gepostet habe, und eine doppelte Eigenschaft gefunden - eine buchstabierte CustomerID und eine buchstabierte CustomerId - über einen Javascript-Tippfehler. Beide Eigenschaften wurden zu dem JSON hinzugefügt, den ich gepostet habe mich.
AVH

Antworten:

225

Höchstwahrscheinlich haben Sie ein Modell, das dieselbe Eigenschaft zweimal enthält . Vielleicht verwenden Sie new, um die Basiseigenschaft auszublenden.

Die Lösung besteht darin, die Eigenschaft zu überschreiben oder einen anderen Namen zu verwenden.

Wenn Sie Ihr Modell teilen, können wir mehr ausarbeiten.

Aliostad
quelle
16
Sagen Sie in C #, wenn Sie Variable1 und Variable1 haben (es wird den Fehler auslösen). Stellen Sie außerdem sicher, dass keine ähnlichen edmx-Namen vorhanden sind (die Tabellenspalte enthält "CURRENCY", einer der Namen der Navigationseigenschaften hatte "Currency")
Robert Koch
7
@Naveen Großartig, es ist behoben! Ich sehe, wie dies kompiliert werden könnte, aber hier Fehler werfen. Bei einigen Teilen des Frameworks (im Gegensatz zu C #) wird die Groß- und Kleinschreibung nicht berücksichtigt.
Aliostad
9
Würde jemand wissen, wie man den "gleichen Schlüssel" identifiziert?
ClayKaboom
1
Ich fing an, dies zu bekommen, nachdem ich mit einigen Ansichtsmodellen herumgespielt hatte (eine Id-Eigenschaft hinzugefügt). Der Fehler bestand darin, dass der JS bereits eine "ID" (ID in Kleinbuchstaben) für eine UI-Verwaltung in das Objekt einfügte. Beim Senden hatte das JSON-Objekt jedoch sowohl die Eigenschaften "ID" als auch "ID", die demselben Schlüssel zugeordnet sind Modellordner von ASP.NET, daher dieser Fehler.
Svend
1
PS: Dies ist in MVC3 zulässig, jedoch nicht in MVC5. Nicht sicher, warum dies geändert wurde.
Julian
20

Ich hatte das gleiche Problem und so habe ich es gelöst. Ich hatte eine doppelte Eigenschaft mit demselben Namen in meinem ViewModel. Eine Eigenschaft befand sich in BaseViewModel und eine andere im abgeleiteten Modell.

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


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

Ich habe das geändert in

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


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

Jetzt funktioniert es gut.

atulpatel.mca
quelle
Vielen Dank, nur eine kurze Info, dies tritt auch dann auf, wenn die Basis und das Modell den gleichen Attributnamen mit unterschiedlichen Groß- und Kleinschreibung haben, z. B. Basis: Benutzer, Modell: Benutzer
Richard Housham
12

Ich hatte ein ähnliches Problem und stellte fest, dass es daran lag, dass ich ein ähnlich benanntes öffentliches Eigentum hatte (das privat sein sollte), das sich nur für den Fall unterschied.

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

gewesen sein sollte

public string PropertyName {get;set;} 
private string propertyName {get;set;}
Hal
quelle
12

Ich hatte 2 Modelleigenschaften wie diese

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

es ist seltsam, dass es diesen Fehler für diese 2 haha ​​geworfen hat ..

Neugierig Benjamin
quelle
6

Ich hatte das Problem nicht in meinem C # -Modell, sondern in dem Javascript-Objekt, das ich mit AJAX gepostet habe. Ich verwende Angular zum Binden und hatte ein großgeschriebenes NotesFeld auf der Seite, während mein C # -Objekt Kleinbuchstaben erwartete notes. Ein aussagekräftigerer Fehler wäre sicher nett.

C #:

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

Winkel / Javascript:

<input ng-model="post.Notes" type="text">
Jason Goemaat
quelle
2
Es ist eine etwas andere Antwort. Keine meiner C # -Klassen hat doppelte Eigenschaften mit unterschiedlichen Fällen, aber der JSON, der an meinen Controller gesendet wurde, hat dies getan. Dachte, es könnte nützlich sein für andere Leute, die nach dem gleichen Problem suchen, wenn sie das Problem nicht in ihrem C # -Code finden können.
Jason Goemaat
Gleich wie Goematt. Das gesendete JSON-Objekt hatte doppelte Namen, obwohl das C # -Objekt, an das ich gebunden war, diese Schlüssel vollständig ignorierte, schlug es dennoch fehl. Das ist dumm, vielleicht sogar ein Fehler in meinem Kopf. Ich kontrolliere nicht das gesendete JSON-Objekt, daher kann ich nicht berücksichtigen, was alle zusätzlichen Felder gesendet werden.
Kukabuka
5

Ich hatte das gleiche Problem, ich habe foreachmein Objekt durchlaufen und das Ergebnis zu a hinzugefügt, Dictionary<string, string>und ich hatte ein Duplikat im Schlüssel aus der Datenbank

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

        }

item.x hatte einen doppelten Wert

Mina Gabriel
quelle
3

Ich fand die Antwort. Es lag an den Variablen. Wie int a und string a. Es gab zwei Variablen mit demselben Namen.

user650922
quelle
1

Hier ist, was ich getan habe, um herauszufinden, welcher Schlüssel zweimal hinzugefügt wurde. Ich habe den Quellcode von http://referencesource.microsoft.com/DotNetReferenceSource.zip heruntergeladen und VS eingerichtet, um die Framework-Quelle zu debuggen. Durch das Öffnen von Dictionary.cs in VS wurde das Projekt ausgeführt, sobald die Seite geladen wurde, ein Debug in der Zeile hinzugefügt ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);und der Schlüsselwert angezeigt. Ich erkannte, dass im JSON ein Buchstabe einer Variablen in Großbuchstaben geschrieben war, in meinem Modell jedoch in Kleinbuchstaben. Ich habe das Modell repariert und jetzt funktioniert der gleiche Code.

bvoleti
quelle
1

Ich habe dies in MVC 5 und Visual Studio Express 2013 getroffen. Ich hatte zwei Eigenschaften mit einem IndexAttributeähnlichen Namen unten. Das Auskommentieren eines davon und das Neukompilieren führten dazu, dass der MVC 5-Controller mit Ansichten gerüstet wurde, wobei Entity Framework erfolgreich war. Auf mysteriöse Weise lief der Gerüstbauer einwandfrei, als ich das Attribut auskommentierte, neu kompilierte und es erneut versuchte.

Möglicherweise wurde das zugrunde liegende Entitätsdatenmodell oder "etwas" zwischengespeichert / beschädigt, und das Entfernen und erneute Hinzufügen des IndexAttributeeinfach ausgelösten Erstellens dieses "Etwas" wurde ausgelöst.

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

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

In MVC 5 stellte ich fest, dass das vorübergehende Auskommentieren von Verweisen auf ein Entity Framework-Modell und das Neukompilieren der Projektseite diesen Fehler beim Gerüstbau verursachte. Sobald ich mit dem Gerüst fertig bin, kommentiere ich den Code aus.

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

Ich möchte eine Antwort hinzufügen, die ich hier nicht sehe. Es hängt sehr mit der akzeptierten Antwort zusammen, ich hatte jedoch keine doppelten Eigenschaften in meinem Modell, es war ein Problem mit meinem Javascript.

Ich habe Ajax gespeichert und das Modell neu erstellt, um es an den Server zurückzusenden. Als ich die Seite zum ersten Mal initialisiert hatte, setzte ich mein ursprüngliches Modell auf eine Variable:

var currentModel = result.Data;

Mein result.Datahat eine Eigenschaft:result.Data.Items

Einige Zeit später mache ich einige Dinge und möchte über Ajax speichern. Ein Teil des Prozesses besteht darin, ein Array von einem Nebenprozess abzurufen, es auf meine currentModel.ItemsEigenschaft zu setzen und currentModelan den Server zu senden .

In meinem Javascript habe ich jedoch Folgendes getan:

currentModel.items = getData();

Ich habe es nicht verstanden, aber in Visual Studio wird der erste Buchstabe für Javascript-Eigenschaften automatisch in Kleinbuchstaben geschrieben (es könnte auch eine ReSharper-Sache sein). Dann habe ich den genauen Fehler von OP erhalten, als ich versucht habe zu speichern, weil currentModel jetzt currentModel.itemsAND hatcurrentModel.Items

Ein einfacher Wechsel von "Items" zu "Items" behebt das Problem.

JasonWilczak
quelle
1

Mein Problem war, dass ich eine @ Url.Action hatte und zweimal einen Wert für dieselbe Eigenschaft gesendet hatte

abiNerd
quelle
1

In meinem Fall läuft der Code einfach gut, wenn Sie ihn kompilieren. Das Aufrufen eines statischen Felds einer statischen Klasse mit einem Wörterbuch wie dem Beispielcode löst jedoch die Ausnahme aus.

Beispielcode

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

Erläuterung ADict hat den "Test" -Schlüssel zweimal hinzugefügt. Wenn Sie also die statische Klasse aufrufen, wird die Ausnahme ausgelöst.

Ahmet Remzi EKMEKCI
quelle
0

Ich hatte das gleiche Problem. Es erschien mir nach der Migration von MVC 3 auf MVC 5.

Ich hatte eine benutzerdefinierte Editorvorlage und musste sie zuvor wie folgt verwenden:

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

Um das Problem zu beheben, musste ich das übergebene ViewDataObjekt entfernen . Am Ende hatte ich also:

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

Ich hoffe es hilft.

Mariusz
quelle
0

Ich habe den gleichen Fehler gehabt. Und nachdem ich bereits gedacht hatte, dass mein Verstand gebrochen ist, weil ich fast alle meine Modelleigenschaften umbenannt hatte, löschte die Lösung eine Referenz in All Syncfusion Controls und fügte Verweise auf die einzelnen Steuerelemente dieser Steuerelemente hinzu. (Von Nuget)

AlfredBauer
quelle
0

In meinem Fall war die Wurzel des Problems der doppelte Eigenschaftsname im Client-JSON, der sich nur durch die Groß- und Kleinschreibung unterschied.

Kubajs
quelle
0

Eine andere Möglichkeit, diesen Fehler zu finden, besteht in einem Dataset mit unbenannten Spalten . Der Fehler wird ausgelöst, wenn das Dataset in JSON serialisiert wird.

Diese Anweisung führt zu einem Fehler:

select @column1, @column2

Das Hinzufügen von Spaltennamen verhindert den Fehler:

select @column1 as col1, @column2 as col2
user9375338
quelle
0

Ich habe den gleichen Fehler gehabt, aber b / c aus verschiedenen Gründen. Entity Framework verwenden. Eine weitere Sache, die ich hier hinzufügen muss, bevor ich meinen Code und meine Lösung freigebe, war, dass ich einen Haltepunkt bei der Controller-Methode hatte, aber dort nicht brach, sondern nur den internen Serverfehler der Ausnahme 500 auslöste.

Ich habe Daten aus der Ansicht über Ajax (http post) an den Controller gesendet. Das Modell, das ich als Parameter erwartet hatte, war eine Klasse. Es wurde mit einer anderen Klasse geerbt.

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

und im Blick

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

Einfach doppelte Felder aus der PurchaseOrder-Klasse entfernt und es funktionierte wie ein Zauber.

Adeel Shekhani
quelle
0

Ich habe den gleichen Fehler gehabt. Wenn ich den Code überprüfe, habe ich festgestellt, dass "GET" -Anforderung auf meiner eckigen Seite (Font-End) und "POST" -Anforderung auf der ASP.net-Seite (Back-End) deklariert ist. Stellen Sie POST / GET auf beiden Seiten ein. Dann wurde der Fehler behoben.

Sanjib Dhar
quelle
0

Ich sah mich einer ähnlichen Ausnahme gegenüber. Überprüfen Sie, ob alle Spalten Kopfzeilennamen (aus der ausgewählten Abfrage in der Datenbank) mit genau übereinstimmenden Eigenschaftsnamen in der Modellklasse haben.

Vikas
quelle
0

Ich hatte dieses Problem im DBContext. Ich habe den Fehler erhalten, als ich versucht habe, eine Update-Datenbank in der Package Manager-Konsole auszuführen, um eine Migration hinzuzufügen:

öffentlicher virtueller IDbSet-Status {get; einstellen; }}

Das Problem war, dass der Typ und der Name gleich waren. Ich habe es geändert in:

öffentliche virtuelle IDbSet-Status {get; einstellen; }}

LuTheZy
quelle