171 votes

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

J'obtiens cette erreur chaque fois que je soumets le formulaire, et la méthode d'action n'est pas appelée pour cette raison :

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

Et les détails de l'exception :

[ArgumentException : Un élément avec le nom même clé a déjà été ajouté].
System.ThrowHelper.ThrowArgumentException(ExceptionResource ressource) +52
System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +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, 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, Object tag) +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 résultat) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

Page d'accueil

<%@ 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='http://stackoverflow.com/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 votes

Vous devez ajouter plus de contexte à cela. Montrez-nous le code du contrôleur et décrivez les actions exactes que vous entreprenez. Faites un peu de débogage par vous-même afin que vos questions soient plus détaillées et ne se limitent pas à de gros morceaux de code/stack.

1 votes

J'ai vérifié de très près le JSON que je postais et j'ai trouvé une propriété en double - l'une épelée CustomerID et l'autre CustomerId - via une faute de frappe en javascript, les deux propriétés avaient été ajoutées au JSON que je postais, donc juste une mise en garde qui a résolu ce problème pour moi.

269voto

Aliostad Points 47792

Très probablement vous avez un modèle qui contient deux fois la même propriété . Vous utilisez peut-être 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 serons en mesure d'en dire plus.

17 votes

En C#, par exemple, si vous avez variable1 et Variable1 (l'erreur se produira). Vérifiez également qu'il n'y a pas de noms edmx similaires (la colonne de la table a "CURRENCY", le nom d'une des propriétés de navigation a "Currency").

7 votes

@Naveen Super c'est corrigé ! Je vois comment cela pourrait compiler mais lancer une erreur ici. Certaines parties du framework (contrairement à C#) sont insensibles à la casse.

13 votes

Quelqu'un saurait-il comment identifier laquelle est "la même clé" ?

24voto

atulpatel.mca Points 81

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

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

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

J'ai changé ça en

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

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

Maintenant, il fonctionne bien.

1 votes

Merci, juste pour info, cela se produit également si la base et le modèle ont le même nom d'attribut avec une casse différente, par exemple Base:User, Model:user.

19voto

Ashish Points 71

J'avais 2 propriétés modèles comme ceci

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

c'est étrange que cette erreur se soit produite pour ces 2 haha

14voto

Hal Points 809

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

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

aurait dû être

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

3voto

user650922 Points 295

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X