web-dev-qa-db-fra.com

Un article avec la même clé a déjà été ajouté

Je reçois cette erreur chaque fois que je soumets le formulaire; la méthode d'action n'est pas appelée pour cette raison:

Un article avec la même clé a déjà été ajouté.

Et les détails de l'exception:

[ArgumentException: un élément avec le la même clé a déjà été ajoutée.]
System.ThrowHelper.ThrowArgumentException (ExceptionResource Resource) +52
System.Collections.Generic.Dictionary`2.Insert (TKey Clé, valeur TValue, ajout booléen) +9382923 System.Linq.Enumerable.ToDictionary (IEnumerable`1 Source, Func`2 keySelector, Func`2 ElementSelector, IEqualityComparer`1 Compare) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 Source, Func`2 cléSélecteur, 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.BindComplexElmentalModel (ControllerContext ControllerContext, ModelBindingContext BindingContext, Modèle d'objet) +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, balise Object) +54
System.Web.Mvc.Async.AsyncResultWrapper.End (IAsyncResult AsyncResult, balise d'objet) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult AsyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (IAsyncResult Résultat) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (IExecutionStep Step, Boolean & completedSynchronously) +184

Voir page

<%@ 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>
      <%} %>

113
user650922

Très probablement, vous avez un modèle qui contient deux fois la même propriété . Peut-être utilisez-vous new pour masquer la propriété de base.

La solution consiste à remplacer la propriété ou à utiliser un autre nom.

Si vous partagez votre modèle, nous pourrons élaborer davantage.

194
Aliostad

J'ai eu le même problème et voici comment je l'ai résolu. J'avais une propriété en double avec le même nom dans mon ViewModel. Une propriété était dans BaseViewModel et une autre dans un modèle dérivé.

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


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

J'ai changé cela en

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


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

Maintenant ça fonctionne bien.

18
atulpatel.mca

J'ai eu un problème similaire et j'ai constaté que c'était parce que j'avais une propriété publique portant le même nom (qui aurait dû être privée) et qui ne différait que par les cas.

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

aurait du être

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

J'ai eu 2 propriétés de modèle comme ceci

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

il est étrange qu'il ait jeté cette erreur pour ces 2 haha ​​.. 

11
Ashish

Le problème ne venait pas de mon modèle C #, mais de l’objet javascript que je publiais en utilisant AJAX. J'utilise Angular pour la liaison et j'avais un champ Notes en majuscule sur la page alors que mon objet C # attendait des minuscules notes. Une erreur plus descriptive serait sûrement Nice.

C #:

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

Angulaire/Javascript:

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

J'ai trouvé la réponse. C'était à cause des variables. Comme int a et string a. il y avait deux variables avec le même nom.

3
user650922

J'ai eu le même problème, j'étais foreach en boucle sur mon objet et en ajoutant le résultat dans un Dictionary<string, string> et j'avais un `dupliquer dans la clé de la base de données 

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

        }

item.x avait une valeur en double 

3
Mina Gabriel

Mon problème était que j'avais un @ Url.Action et que j'avais envoyé deux fois une valeur pour la même propriété

2
abiNerd

Voici ce que j'ai fait pour trouver la clé qui a été ajoutée deux fois. J'ai téléchargé le code source depuis http://referencesource.Microsoft.com/DotNetReferenceSource.Zip et d'installer VS pour déboguer une source d'infrastructure. Dictionary.cs ouvert dans VS a exécuté le projet, une fois la page chargée, ajouté un débogage à la ligne ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate); et était en mesure de voir la valeur 'clé'. J'ai réalisé que dans le JSON, une lettre d'une variable était en majuscule, mais dans mon modèle, elle était en minuscule. J'ai corrigé le modèle et maintenant le même code fonctionne.

1
bvoleti

Je voudrais ajouter une réponse que je ne vois pas ici. C'est très lié à la réponse acceptée, cependant, je n'avais pas de propriétés dupliquées sur mon modèle, c'était un problème avec mon Javascript.

Je faisais quelques sauvegardes Ajax où je reconstruisais le modèle pour le renvoyer au serveur. Lorsque j'ai initialisé la page, j'ai défini mon modèle d'origine sur une variable:

var currentModel = result.Data;

Mon result.Data a une propriété: result.Data.Items

Donc, quelque temps plus tard, je fais certaines choses et je veux sauvegarder, via Ajax. Une partie du processus consiste à extraire un tableau d'un processus secondaire, à le définir sur ma propriété currentModel.Items et à envoyer currentModel au serveur.

Dans mon Javascript, cependant, j'ai fait ceci à la place:

currentModel.items = getData();

Je ne l'ai pas compris, mais dans Visual Studio, la première lettre des propriétés Javascript est automatiquement mise en minuscule (il peut s'agir également d'une chose ReSharper). Ensuite, j'ai eu l'erreur exacte signalée par OP lorsque j'ai essayé de sauvegarder parce que currentModel a maintenant currentModel.items AND currentModel.Items

Un simple changement de "éléments" en "éléments" a résolu le problème.

1
JasonWilczak

Dans MVC 5, j’ai constaté que la suppression temporaire des commentaires sur les références à un modèle Entity Framework et la recompilation du côté du projet augmentaient cette erreur lors de l’échafaudage. Une fois que j'ai fini d'échafauder je décomment le code.

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

J'ai frappé ceci dans MVC 5 et Visual Studio Express 2013. J'avais deux propriétés avec une IndexAttribute comme ci-dessous. La mise en commentaire de l'un d'entre eux et la recompilation ont abouti à l'échafaudage du contrôleur MVC 5 avec des vues, en utilisant Entity Framework. Mystérieusement, lorsque j'ai supprimé le commentaire, recompilé et réessayé l'attribut, l'échafaudage fonctionnait parfaitement.

Peut-être que le modèle de données d'entité sous-jacent ou "quelque chose" a été mis en cache/corrompu, et que supprimer et rajouter la IndexAttribute a simplement déclenché une reconstruction de ce "quelque chose".

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

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

Une autre façon de rencontrer cette erreur consiste à utiliser un ensemble de données avec des colonnes non nommées . L'erreur est renvoyée lorsque le jeu de données est sérialisé en JSON.

Cette déclaration entraînera une erreur:

select @column1, @column2

L'ajout de noms de colonnes permettra d'éviter l'erreur:

select @column1 as col1, @column2 as col2
0
dataspun

J'ai eu la même erreur. Quand j’ai vérifié le code, j’ai trouvé que la requête "GET" était déclarée dans mon côté angular (font-end) et la requête "POST" dans le côté ASP.net (back-end). Définissez POST/GET n'importe lequel des deux côtés. Puis résolu l'erreur.

0
Sanjib Dhar

Dans mon cas, lorsque vous compilez le code, tout fonctionne très bien. Mais appeler l'un des champs statiques d'une classe statique ayant un dictionnaire, comme l'exemple de code, lève l'exception.

Exemple de code

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

Explication ADict a la touche "test" ajoutée deux fois. Ainsi, lorsque vous appelez la classe statique, elle lève l'exception.

0

J'ai eu la même erreur mais b/c de diff raisons. Utilisation du framework Entity. Une dernière chose que je dois ajouter ici avant de partager mon code et ma solution, j’avais un point de rupture sur la méthode du contrôleur, mais elle ne cassait pas là-bas, mais jeté une erreur de serveur interne exception 500.

Je publiais des données de la vue au contrôleur via ajax (post http). Le modèle que j'attendais en tant que paramètre était une classe. Il a été hérité avec une autre classe.

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

et en vue 

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

Supprimez simplement les champs en double de la classe PurchaseOrder et cela fonctionne à merveille.

0
Adeel Shekhani

J'ai eu la même erreur. Et après avoir déjà pensé que mon esprit était en panne, parce que j'avais renommé presque toutes les propriétés de mes modèles, la solution était de supprimer une référence sur Tous les contrôles Syncfusion et d'ajouter des références aux contrôles individuels de ces contrôles. (De Nuget)

0
AlfredBauer

Dans mon cas, la racine du problème était le nom de propriété en double dans le json client qui ne différait que par la sensibilité à la casse.

0
kubajs

J'ai eu le même problème. Il m'est apparu après la migration de MVC 3 vers MVC 5.

J'avais un template d'éditeur personnalisé et je devais l'utiliser comme ça auparavant:

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

Pour résoudre le problème, j'ai dû supprimer l'objet ViewData. Donc à la fin j'ai eu:

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

J'espère que ça aide.

0
Mariusz