Элемент с тем же ключом уже добавлен
Я получаю эту ошибку всякий раз, когда я отправляю форму, также метод действия не вызывается из-за этого:
Элемент с тем же ключом уже добавлен.
И сведения об исключении:
[ArgumentException: элемент с тот же ключ уже добавлен.]
System.ThrowHelper.ThrowArgumentException(ExceptionResource ресурс) +52
System.Collections.Generic.Dictionary`2.Insert(TKey ключ, значение TValue, Boolean add) +9382923 System.Linq.Enumerable.ToDictionary(IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 сравнительный) +252
System.Linq.Enumerable.ToDictionary(IEnumerable`1 source, Func`2 keySelector, Сравнение IEqualityComparer`1) +91
System.Web.Mvc.ModelBindingContext.get_PropertyMetadata() +228 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor свойствоDescriptor) +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, тег объекта) +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 результат) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean & completedSynchronously) +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>
<%} %>
Ответы
Ответ 1
Скорее всего, у вас есть модель, которая содержит одно и то же свойство дважды. Возможно, вы используете new
, чтобы скрыть базовое свойство.
Решение - переопределить свойство или использовать другое имя.
Если вы поделитесь своей моделью, мы сможем подробнее разобраться.
Ответ 2
У меня была такая же проблема, и я решил это. У меня было двойное свойство с тем же именем в моей модели ViewModel. Одно свойство было в BaseViewModel, а другое - в производной модели.
public class BaseviewModel{
public int UserId { get; set; }
}
public class Model : BaseViewModel
{
public int UserId { get; set; }
}
Я изменил это на
public class BaseviewModel{
public int UserId { get; set; }
}
public class Model : BaseViewModel
{
public int User_Id { get; set; }
}
Теперь он работает нормально.
Ответ 3
У меня была аналогичная проблема, и я обнаружил, что это связано с тем, что у меня было аналогичное публичное свойство (которое должно было быть частным), которое только отличалось в случае.
public string PropertyName {get;set;} // actually set propertyName, get propertyName
public string propertyName {get;set;}
должно быть
public string PropertyName {get;set;}
private string propertyName {get;set;}
Ответ 4
У меня было 2 свойства модели, подобные этому
public int LinkId {get;set;}
public int LinkID {get;set;}
Странно, что он выбросил эту ошибку для этих двух ха-ха..
Ответ 5
У меня была проблема не в моей модели С#, а в объекте javascript, который я отправлял с помощью AJAX. Я использую Angular для привязки и имел заглавное поле Notes
на странице, а мой объект С# ожидал нижний регистр Notes
. Более описательная ошибка будет приятной.
С#:
class Post {
public string notes { get; set; }
}
Angular/JavaScript:
<input ng-model="post.Notes" type="text">
Ответ 6
Я нашел ответ. Это было из-за переменных. Как int a и string a. были две переменные с тем же именем.
Ответ 7
У меня была одна и та же проблема: я был foreach
, зацикливая на моем объекте и добавляя результат в Dictionary<string, string>
, и у меня был `Duplicate в ключе из базы данных
foreach (var item in myObject)
{
myDictionary.Add(Convert.ToString(item.x),
item.y);
}
item.x
имеет двойное значение
Ответ 8
Моя проблема заключалась в том, что у меня был @Url.Action, и я дважды отправил значение для того же свойства
Ответ 9
Вот что я сделал, чтобы узнать ключ, который добавляется дважды. Я загрузил исходный код из http://referencesource.microsoft.com/DotNetReferenceSource.zip и настроил VS для отладки исходного кода. Открытый Dictionary.cs в VS запускал проект, после загрузки страницы добавлял отладку в строке ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
и мог видеть значение "ключ". Я понял, что в JSON одна буква переменной была в верхнем регистре, но в моей модели она была строчной. Я исправил модель и теперь работает тот же код.
Ответ 10
Я попал в это в MVC 5 и Visual Studio Express 2013. У меня было два свойства с IndexAttribute
, как показано ниже. Комментируя один из них и перекомпилировав, выстроили в лесу контроллер MVC 5 с представлениями, используя Entity Framework. Загадочно, когда я раскоментировал атрибут, перекомпилировал и снова попытался, scaffolder работал нормально.
Возможно, базовая модель данных сущностей или "что-то" была кэширована/повреждена, а удаление и повторное добавление IndexAttribute
просто вызвало перестроение этого "чего-то".
[Index(IsUnique = true)]
public string Thing1 { get; set; }
[Index(IsUnique = true)]
public string Thing2 { get; set; }
Ответ 11
В MVC 5 я обнаружил, что временно комментирует ссылки на модель Entity Framework и перекомпилирует сторону проекта, выполнив эту ошибку при создании лесов. Как только я закончу строительные леса, я раскомментирую код.
public Guid CreatedById { get; private set; }
// Commented out so I can scaffold:
// public virtual UserBase CreatedBy { get; private set; }
Ответ 12
Я хотел бы добавить ответ, который я не вижу здесь. Это очень связано с принятым ответом, однако у меня не было дублированных свойств на моей модели, это была проблема с моим Javascript.
Я делал некоторое спасение Ajax, где я перестраивал модель для отправки обратно на сервер. Когда я сначала инициализировал страницу, я установил свою исходную модель в переменную:
var currentModel = result.Data;
My result.Data
имеет свойство: result.Data.Items
Итак, через некоторое время я кое-что делаю и хочу сэкономить через Ajax. Часть процесса состоит в том, чтобы захватить массив из некоторого побочного процесса и установить его в мое свойство currentModel.Items
и отправить currentModel
на сервер.
В моем Javascript, однако, я сделал это, вместо этого:
currentModel.items = getData();
Я не поймал его, но в Visual Studio он автоматически запустит первую букву для свойств Javascript (это тоже может быть ReSharper). Затем я получил точную ошибку, отправленную OP при попытке сохранить, поскольку currentModel теперь имеет currentModel.Items
И currentModel.Items
Простая замена "пунктов" на "Элементы" устраняет проблему.
Ответ 13
У меня была такая же проблема. Он появился для меня после перехода на MVC 5 из MVC 3.
У меня был пользовательский шаблон редактора и ему пришлось использовать его так:
@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField", this.ViewData)
Чтобы решить проблему, мне пришлось удалить проходящий объект ViewData
. Поэтому в конце я имел:
@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField")
Надеюсь, что это поможет.
Ответ 14
У меня была такая же ошибка. И после того, как я уже думал, что мой ум сломан, потому что я переименовал почти все свойства моих моделей, решение было удалить одну ссылку на All Syncfusion Controls и добавить ссылки на отдельные элементы управления этого элемента управления. (От Nuget)
Ответ 15
В моем случае корень проблемы был двойным именем свойства в клиенте json, который отличался только чувствительностью к регистру.
Ответ 16
Другой способ встретить эту ошибку - из набора данных с неназванными столбцами. Ошибка генерируется, когда набор данных сериализуется в JSON.
Это утверждение приведет к ошибке:
select @column1, @column2
Добавление имен столбцов предотвратит ошибку:
select @column1 as col1, @column2 as col2
Ответ 17
У меня была такая же ошибка, но б/с по разным причинам. Использование Entity Framework. Еще одна вещь, которую я должен добавить здесь, прежде чем я поделюсь своим кодом и решением, у меня была точка останова на методе контроллера, но он не ломался там, просто выдает исключение 500 внутренняя ошибка сервера.
Я отправлял данные из представления в контроллер через ajax (http post). Модель, которую я ожидал в качестве параметра, была классом. Это было унаследовано с другим классом.
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; }
}
и ввиду
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);
});
Просто удалили дублированные поля из класса PurchaseOrder, и это сработало как прелесть.
Ответ 18
В моем случае, просто когда вы компилируете код, он работает просто отлично. Но вызов одного из статического поля статического класса, имеющего словарь, как в примере кода, вызывает исключение.
Образец кода
public static AClass
{
public static Dictionary<string, string> ADict = new Dictionary<string, string>()
{
{"test","value1"},{"test","value2"},
};
}
Пояснение ADict имеет дважды добавленный ключ "test". Итак, когда вы вызываете статический класс, он выдает исключение.
Ответ 19
У меня была такая же ошибка. Когда я проверил код, я обнаружил, что объявляю запрос "GET" на моей угловой стороне (font-end) и объявляю запрос "POST" на стороне ASP.net(back-end). Установите POST/GET любой в обе стороны. Затем решил ошибку.