Ya se ha agregado un elemento con la misma clave

135

Recibo este error cada vez que envío el formulario y el método de acción no se llama debido a esto:

Ya se ha agregado un elemento con la misma clave.

Y los detalles de excepción:

[ArgumentException: ya se ha agregado un elemento con la misma clave.]
System.ThrowHelper.ThrowArgumentException (ExceptionResource resource) +52
System.Collections.Generic.Dictionary`2.Insert (tecla TKey, valor TValue, suma booleana) +9382923 Sistema .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 comparador) +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 + parámetroDescripción)
System.Web.Mvc.ControllerActionInvoker.GetParameterValues ​​(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +830 System.Web.Mvc.Controller.Execute .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, etiqueta de objeto) +54
System.Web.Mvc.Async.AsperncResultWrap. End (IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRquestes (IAsyncRandult.EndProcessRequestes)
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, booleano y completado sincrónicamente) +184

Ver pagina

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

usuario650922
fuente
2
Necesita agregar más contexto a esto. Muéstranos el código del controlador y describe las acciones exactas que estás tomando. Realice una pequeña depuración por su cuenta para que sus preguntas sean más detalladas y no solo grandes cantidades de código / pila.
Chev
Revisé mi JSON, estaba publicando muy de cerca y encontré una propiedad duplicada, una deletreada CustomerID y otra de CustomerId, a través de un error tipográfico de JavaScript, ambas propiedades se habían agregado al JSON que estaba publicando, así que solo un aviso que resolvió este problema para yo.
AVH

Respuestas:

225

Lo más probable es que tenga un modelo que contenga la misma propiedad dos veces . Quizás esté utilizando newpara ocultar la propiedad base.

La solución es anular la propiedad o usar otro nombre.

Si comparte su modelo, podríamos elaborar más.

Aliostad
fuente
16
En C #, por ejemplo, si tiene variable1 y Variable1 (arrojará el error). Además, verifique para asegurarse de que no haya nombres edmx similares (la columna de la tabla tiene "MONEDA", uno de los nombres de Propiedades de navegación tenía "Moneda")
Robert Koch
77
@Naveen ¡Genial, está arreglado! Veo cómo esto podría compilarse, pero arroja un error aquí. Algunas partes del marco (a diferencia de C #) no distinguen entre mayúsculas y minúsculas.
Aliostad
9
¿Alguien sabría identificar cuál es "la misma clave"?
ClayKaboom
1
Comencé a recibir esto después de jugar con algunos modelos de vista (agregué una propiedad Id). El error fue que el JS ya estaba colocando un "id" (id minúscula) en el objeto para alguna administración de la interfaz de usuario, pero al enviarlo, el objeto JSON tenía las propiedades "Id" e "id", que se asigna a la misma clave en Carpeta modelo de ASP.NET, de ahí este error.
Svend
1
PD: esto está permitido en MVC3, pero no en MVC5. No estoy seguro de por qué esto ha cambiado.
Julian
20

Tuve el mismo problema y así es como lo resolví. Tenía una propiedad duplicada con el mismo nombre en mi ViewModel. Una propiedad estaba en BaseViewModel y otra en el modelo derivado.

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


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

Cambié eso a

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


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

Ahora está funcionando bien.

atulpatel.mca
fuente
Gracias, solo un comentario rápido, esto también ocurre incluso si la base y el modelo tienen el mismo nombre de atributo con un caso diferente, por ejemplo, Base: Usuario, Modelo: usuario
Richard Housham
12

Tuve un problema similar y descubrí que era porque tenía una propiedad pública con un nombre similar (que debería haber sido privada) que solo difería en el caso.

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

debería haber sido

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

Tenía 2 propiedades de modelo como esta

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

es extraño que arroje este error para estos 2 jaja ..

CuriosoBenjamin
fuente
6

Tuve el problema no en mi modelo C #, sino en el objeto javascript que estaba publicando usando AJAX. Estoy usando Angular para la encuadernación y tenía un Notescampo en mayúscula en la página mientras mi objeto C # esperaba en minúsculas notes. Un error más descriptivo seguramente sería bueno.

C#:

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

Angular / Javascript:

<input ng-model="post.Notes" type="text">
Jason Goemaat
fuente
2
Es una respuesta ligeramente diferente, ninguna de mis clases de C # tiene propiedades duplicadas con diferentes casos, pero el JSON que se estaba enviando a mi controlador sí. Pensé que podría ser útil con otras personas que buscan el mismo problema si no pueden encontrar el problema en su código C # ..
Jason Goemaat
Igual que Goematt. El objeto JSON que se estaba enviando tenía nombres duplicados a pesar de que el objeto c # al que estaba vinculando ignoraba por completo esas claves, todavía falló. Esto es tonto, tal vez incluso un error en mi mente. No estoy controlando el objeto JSON que se envía, por lo que no puedo dar cuenta de lo que se envían todos los campos adicionales.
kukabuka
5

Tuve el mismo problema, estaba foreachrecorriendo mi objeto y agregando el resultado en Dictionary<string, string>ay tenía un `Duplicar en la clave de la base de datos

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

        }

item.x tenía un valor duplicado

Mina Gabriel
fuente
3

Encontré la respuesta. Fue por las variables. Como int a y string a. Había dos variables con el mismo nombre.

usuario650922
fuente
1

Esto es lo que hice para descubrir la clave que se agregó dos veces. Descargué el código fuente de http://referencesource.microsoft.com/DotNetReferenceSource.zip y configuré VS para depurar la fuente del marco. Abrió Dictionary.cs en VS ejecutó el proyecto, una vez que se carga la página, agregó una depuración en la línea ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);y pude ver el valor 'clave'. Me di cuenta de que en el JSON una letra de una variable estaba en mayúscula, pero en mi modelo estaba en minúscula. Arreglé el modelo y ahora funciona el mismo código.

bvoleti
fuente
1

Llegué a esto en MVC 5 y Visual Studio Express 2013. Tenía dos propiedades con un me IndexAttributegusta a continuación. Comentando uno de ellos y recompilando resultó en andamiaje del controlador MVC 5 con vistas, usando Entity Framework exitosamente. Misteriosamente, cuando descomenté el atributo, volví a compilar e intenté nuevamente, el andamio funcionó muy bien.

Quizás el modelo de datos de entidad subyacente o "algo" se almacenó en caché / corrompido, y eliminar y volver a agregar IndexAttributesimplemente desencadenó una reconstrucción de ese "algo".

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

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

En MVC 5 descubrí que comentar temporalmente las referencias a un modelo de Entity Framework y volver a compilar el lado del proyecto aumentó este error al andamiar. Una vez que termino el andamio descomento el código.

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

Me gustaría agregar una respuesta que no veo aquí. Está muy relacionado con la respuesta aceptada, sin embargo, no tenía propiedades duplicadas en mi modelo, era un problema con mi Javascript.

Estaba haciendo un guardado de Ajax donde estaba reconstruyendo el modelo para enviarlo de vuelta al servidor. Cuando inicialicé la página por primera vez, configuré mi modelo original en una variable:

var currentModel = result.Data;

Mi result.Datatiene una propiedad:result.Data.Items

Entonces, algún tiempo después, hago algunas cosas y quiero guardar, a través de Ajax. Parte del proceso es tomar una matriz de algún proceso secundario y establecerla en mi currentModel.Itemspropiedad y enviarla currentModelal servidor.

Sin embargo, en mi Javascript hice esto:

currentModel.items = getData();

No lo entendí, pero en Visual Studio, se minúscula automáticamente la primera letra para las propiedades de Javascript (también podría ser una cosa ReSharper). Luego, recibí el error exacto publicado por OP cuando intenté guardar porque currentModel ahora tiene currentModel.itemsANDcurrentModel.Items

Un simple cambio de "elementos" a "Elementos" solucionó el problema.

JasonWilczak
fuente
1

Mi problema era que tenía una @ Url.Action y había enviado dos veces un valor para la misma propiedad

abiNerd
fuente
1

En mi caso, simplemente cuando compila el código, funciona bien. Pero llamar a uno de un campo estático de una clase estática que tiene un diccionario como el código de muestra, arroja la excepción.

Código de muestra

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

Explicación ADict tiene la clave "prueba" agregada dos veces. Entonces, cuando llamas a la clase estática, arroja la excepción.

Ahmet Remzi EKMEKCI
fuente
0

Tuve el mismo problema Me pareció después de migrar a MVC 5 desde MVC 3.

Tenía una plantilla de editor personalizada y tuve que usarla así antes:

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

Para resolver el problema, tuve que eliminar el ViewDataobjeto que pasaba . Así que al final tuve:

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

Espero eso ayude.

Mariusz
fuente
0

He tenido el mismo error Y después de haber pensado que mi mente está rota, porque había cambiado el nombre de casi todas las propiedades de mis modelos, la solución fue eliminar una referencia en Todos los controles de sincronización y agregar referencias a los controles individuales de estos controles. (De Nuget)

AlfredBauer
fuente
0

En mi caso, la raíz del problema era el nombre de propiedad duplicado en el cliente json, que solo difería según la distinción entre mayúsculas y minúsculas.

kubajs
fuente
0

Otra forma de encontrar este error es desde un conjunto de datos con columnas sin nombre . El error se produce cuando el conjunto de datos se serializa en JSON.

Esta declaración dará como resultado un error:

select @column1, @column2

Agregar nombres de columna evitará el error:

select @column1 as col1, @column2 as col2
usuario9375338
fuente
0

He tenido el mismo error pero b / c de razón dif. Usando Entity framework. Una cosa más que necesito agregar aquí antes de compartir mi código y mi solución, tuve un punto de interrupción en el método del controlador, pero no se rompió allí, solo arrojé la excepción 500 error interno del servidor.

Estaba publicando datos desde la vista al controlador a través de ajax (publicación http). El modelo que esperaba como parámetro era una clase. Fue heredado con alguna otra clase.

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

y a la vista

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

Simplemente eliminó los campos duplicados de la clase PurchaseOrder y funcionó de maravilla.

Adeel Shekhani
fuente
0

He tenido el mismo error Cuando reviso el código, encontré que declara la solicitud "GET" en mi lado angular (fuente-fin) y declaro la solicitud "POST" en el lado ASP.net (back-end). Establecer POST / GET cualquiera en ambos lados. Luego resolvió el error.

Sanjib Dhar
fuente
0

Me enfrenté a una excepción similar. Compruebe si todas las columnas tienen nombres de encabezado (de la consulta de selección en la base de datos) con nombres de propiedades que coinciden exactamente en la clase de modelo.

Vikas
fuente
0

Tuve este problema en el DBContext. Recibí el error cuando intenté ejecutar una base de datos de actualización en la consola de Package Manager para agregar una migración:

Estado de IDbSet virtual público {get; conjunto; }

El problema era que el tipo y el nombre eran iguales. Lo cambié a:

Estados de IDbSet virtuales públicos {get; conjunto; }

LuTheZy
fuente