Eu recebo esse erro sempre que envio o formulário e o método de ação não está sendo chamado por causa disso:
Um item com a mesma chave já foi adicionado.
E os detalhes da exceção:
[ArgumentException: um item com a mesma chave já foi adicionado.]
System.ThrowHelper.ThrowArgumentException (recurso ExceptionResource) +52
System.Collections.Generic.Dictionary`2.Insert (chave TKey, valor TValue, adição booleana) +9382923 System .Linq.Enumerable.ToDictionary (fonte IEnumerable`1, Func`2 keySelector, Func`2 elementSelector, comparador IEqualityComparer`1) +252
System.Linq.Enumerable.ToDictionary (IEnumerable`1 fonte, 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, Modelo de objeto) +98 System.Web.Mvc.DefaultModelBinder.BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) +548 System.Web.Mvc.ControllerActionInvoker.GetParameterValue (ControllerContext controllerContextDesDescription)
System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext ControllerContext, ModelBindingContext bindingContext) +2504
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 () .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, marca de objeto) +54
System.Web.Mvc.Async.AsyncResultWrapper. Fim (IAsyncResult asyncResult, marca de objeto) +40
System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest (resultado de IAsyncResult) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +8836913 System.Web.HttpApplication.ExecuteStep (etapa IExecutionStep, booleana e concluída de forma síncrona) +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>
<%} %>
fonte
Respostas:
Provavelmente , você tem um modelo que contém a mesma propriedade duas vezes . Talvez você esteja usando
new
para ocultar a propriedade base.A solução é substituir a propriedade ou usar outro nome.
Se você compartilhar seu modelo, poderemos elaborar mais.
fonte
Eu tive o mesmo problema e foi assim que resolvi. Eu tinha uma propriedade duplicada com o mesmo nome no meu ViewModel. Uma propriedade estava em BaseViewModel e outra em Model derivado.
Eu mudei isso para
Agora está funcionando bem.
fonte
Eu tive um problema semelhante e descobri que era porque eu tinha uma propriedade pública com nome semelhante (que deveria ter sido privado) que diferia apenas no caso.
deveria ter ficado
fonte
Eu tinha duas propriedades do modelo como esta
é estranho que ele jogou esse erro para esses 2 haha ..
fonte
Eu tive o problema não no meu modelo C #, mas no objeto javascript que eu estava postando usando AJAX. Estou usando Angular para ligação e tinha um
Notes
campo em maiúsculas na página enquanto meu objeto C # esperava letras minúsculasnotes
. Um erro mais descritivo seria bom.C #:
Angular / Javascript:
fonte
Eu tive o mesmo problema, estava
foreach
fazendo um loop sobre meu objeto e adicionando o resultado em umDictionary<string, string>
e eu tinha um `Duplicar na chave do banco de dadositem.x
teve um valor duplicadofonte
Eu encontrei a resposta. Foi por causa das variáveis. Como int a e string a. havia duas variáveis com o mesmo nome.
fonte
Aqui está o que eu fiz para descobrir a chave que estava sendo adicionada duas vezes. Fiz o download do código-fonte em http://referencesource.microsoft.com/DotNetReferenceSource.zip e configurei o VS para depurar a fonte da estrutura. O Dictionary.cs aberto no VS executou o projeto, após o carregamento da página, adicionou uma depuração na linha
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
e conseguiu ver o valor da 'chave'. Percebi que no JSON uma letra de uma variável estava em maiúscula, mas no meu modelo era minúscula. Corrigi o modelo e agora o mesmo código funciona.fonte
Eu bati isso no MVC 5 e no Visual Studio Express 2013. Eu tinha duas propriedades
IndexAttribute
como abaixo. Comentar um deles e recompilar resultou no andaime do controlador MVC 5 com visualizações, usando o Entity Framework com êxito. Misteriosamente, quando descomentei o atributo, recompilei e tentei novamente, o andaime funcionou perfeitamente.Talvez o modelo de dados da entidade subjacente ou "algo" tenha sido armazenado em cache / corrompido, e remover e adicionar novamente o
IndexAttribute
simplesmente desencadeou uma reconstrução desse "algo".fonte
No MVC 5, descobri que comentar temporariamente as referências a um modelo do Entity Framework e recompilar o lado do projeto causavam esse erro ao andaimes. Depois de terminar o andaime, descomente o código.
fonte
Gostaria de adicionar uma resposta que não vejo aqui. Está muito relacionado à resposta aceita, no entanto, eu não tinha propriedades duplicadas no meu modelo, era um problema com o meu Javascript.
Eu estava fazendo um salvamento do Ajax, onde estava reconstruindo o modelo para enviar de volta ao servidor. Quando inicializei a página, configurei meu modelo original para uma variável:
My
result.Data
tem uma propriedade:result.Data.Items
Então, algum tempo depois, faço algumas coisas e quero salvar, via Ajax. Parte do processo é pegar uma matriz de algum processo paralelo e configurá-la para minha
currentModel.Items
propriedade e enviarcurrentModel
para o servidor.No meu Javascript, no entanto, fiz isso:
Eu não peguei, mas no Visual Studio, ele irá minúscula a primeira letra para as propriedades Javascript (também pode ser uma coisa do ReSharper). Em seguida, recebi o erro exato postado pelo OP ao tentar salvar porque o currentModel agora possui
currentModel.items
ANDcurrentModel.Items
Uma simples mudança de "itens" para "Itens" resolveu o problema.
fonte
Meu problema era que eu tinha uma @ Url.Action e enviava um valor para a mesma propriedade duas vezes
fonte
No meu caso, simplesmente quando você compila o código, ele funciona muito bem. Mas chamar um de um campo estático de uma classe estática que possui um dicionário como o exemplo de código gera uma exceção.
Código de amostra
Explicação O ADict adicionou a chave "test" duas vezes. Portanto, quando você chama a classe estática, ela lança a exceção.
fonte
Eu tive o mesmo problema. Pareceu-me depois de migrar para o MVC 5 do MVC 3.
Eu tinha um modelo de editor personalizado e precisava usá-lo dessa maneira antes:
Para resolver o problema, tive que remover o
ViewData
objeto que estava passando . Então, no final, eu tive:Espero que ajude.
fonte
Eu tive o mesmo erro. E depois que eu já pensei que minha mente estava quebrada, porque havia renomeado quase todas as propriedades de meus modelos, a solução foi excluir uma referência em Todos os controles de sincronização e adicionar referências aos controles individuais desses controles. (De Nuget)
fonte
No meu caso, a raiz do problema era o nome da propriedade duplicado no cliente json, que diferia apenas pela distinção entre maiúsculas e minúsculas.
fonte
Outra maneira de encontrar esse erro é de um conjunto de dados com colunas sem nome . O erro é lançado quando o conjunto de dados é serializado no JSON.
Esta declaração resultará em erro:
A adição de nomes de colunas impedirá o erro:
fonte
Eu tive o mesmo erro, mas b / c de razão diff. Usando estrutura de entidade. Mais uma coisa que preciso adicionar aqui antes de compartilhar meu código e solução, eu tinha um ponto de interrupção no método do controlador, mas ele não estava funcionando lá, apenas lançando a exceção 500 erro interno do servidor.
Eu estava postando dados do modo de exibição no controlador através do ajax (http post). O modelo que eu esperava como parâmetro era uma classe. Foi herdado com alguma outra classe.
e em vista
Basta remover os campos duplicados da classe PurchaseOrder e funcionou como um encanto.
fonte
Eu tive o mesmo erro. Quando verifico o código, descobri que declarar a solicitação "GET" no meu lado angular (fonte) e declarar a solicitação "POST" no lado do ASP.net (back-end). Defina POST / GET para qualquer um dos dois lados. Então resolveu o erro.
fonte
Eu enfrentei exceção semelhante. Verifique se todas as colunas possuem nomes de cabeçalho (na consulta selecionada no banco de dados) com nomes de propriedades exatamente correspondentes na classe de modelo.
fonte
Eu tive esse problema no DBContext. Erro ao tentar executar um banco de dados de atualização no console do Package Manager para adicionar uma migração:
Status público virtual do IDbSet {get; conjunto; }
O problema era que o tipo e o nome eram os mesmos. Eu mudei para:
estatutos públicos virtuais do IDbSet {get; conjunto; }
fonte