每当我提交表单时,我都会收到此错误,并且由于以下原因未调用操作方法:
已添加具有相同密钥的项目。
以及异常详细信息:
[ArgumentException: 已添加具有相同键的项。] System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源) +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 比较器) +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 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.W eb.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(IAsync结果_)+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 result) +38 System. Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
查看页面
<%@ 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>
<%} %>
很可能,您的模型两次包含相同的属性。也许您正在使用 new
来隐藏基本属性。
解决方案是覆盖该属性或使用其他名称。
如果您分享您的模型,我们将能够详细说明。
我有同样的问题,这就是我解决它的方法。我的 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; }
}
现在它工作正常。
我有 2 个这样的模型属性
public int LinkId {get;set;}
public int LinkID {get;set;}
奇怪的是它为这两个哈哈抛出了这个错误..
我有一个类似的问题,发现这是因为我有一个类似命名的公共财产(应该是私有的),只是大小写不同。
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;}
我的问题不在我的 C# 模型中,而是在我使用 AJAX 发布的 javascript 对象中。我正在使用 Angular 进行绑定,并且页面上有一个大写的 Notes
字段,而我的 C# 对象需要小写的 notes
。一个更具描述性的错误肯定会很好。
C#:
class Post {
public string notes { get; set; }
}
角/Javascript:
<input ng-model="post.Notes" type="text">
我遇到了同样的问题,我正在 foreach
循环我的对象并将结果添加到 Dictionary<string, string>
并且我在数据库中的键中有一个“重复”
foreach (var item in myObject)
{
myDictionary.Add(Convert.ToString(item.x),
item.y);
}
item.x
有重复值
我找到了答案。这是因为变量。比如 int a 和 string a。有两个同名的变量。
就我而言,只需编译代码,它就可以正常运行。但是调用具有像示例代码一样的字典的静态类的静态字段之一,会引发异常。
示例代码
public static AClass
{
public static Dictionary<string, string> ADict = new Dictionary<string, string>()
{
{"test","value1"},{"test","value2"},
};
}
解释 ADict 已添加两次“测试”键。因此,当您调用静态类时,它会引发异常。
这是我为找出被添加两次的密钥所做的。我从 http://referencesource.microsoft.com/DotNetReferenceSource.zip 下载了源代码并将 VS 设置为调试框架源。在 VS 中打开 Dictionary.cs 运行项目,页面加载后,在 ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
行添加调试并能够看到“键”值。我意识到在 JSON 中变量的一个字母是大写的,但在我的模型中是小写的。我修复了模型,现在相同的代码可以工作。
我在 MVC 5 和 Visual Studio Express 2013 中实现了这一点。我有两个带有 IndexAttribute
的属性,如下所示。注释掉其中一个并重新编译导致使用实体框架成功地为 MVC 5 控制器搭建脚手架。奇怪的是,当我取消注释属性、重新编译并再次尝试时,脚手架运行得很好。
可能底层实体数据模型或“某物”已被缓存/损坏,移除并重新添加 IndexAttribute
只会触发该“某物”的重建。
[Index(IsUnique = true)]
public string Thing1 { get; set; }
[Index(IsUnique = true)]
public string Thing2 { get; set; }
在 MVC 5 中,我发现临时注释掉对实体框架模型的引用,并重新编译项目方在搭建脚手架时会出现此错误。完成脚手架后,我取消注释代码。
public Guid CreatedById { get; private set; }
// Commented out so I can scaffold:
// public virtual UserBase CreatedBy { get; private set; }
我想补充一个我在这里看不到的答案。它与接受的答案非常相关,但是,我的模型上没有重复的属性,这是我的 Javascript 的问题。
我正在做一些 Ajax 保存,我正在重建模型以发送回服务器。当我第一次初始化页面时,我将原始模型设置为一个变量:
var currentModel = result.Data;
我的 result.Data
有一个属性:result.Data.Items
所以,过了一段时间,我做了一些事情并想通过 Ajax 保存。该过程的一部分是从某个辅助进程中获取一个数组并将其设置为我的 currentModel.Items
属性并将 currentModel
发送到服务器。
但是,在我的 Javascript 中,我这样做了:
currentModel.items = getData();
我没听懂,但在 Visual Studio 中,它会自动将 Javascript 属性的第一个字母小写(它也可能是 ReSharper 的东西)。然后,当我尝试保存时,我得到了 OP 发布的确切错误,因为 currentModel 现在有 currentModel.items
AND currentModel.Items
从“项目”到“项目”的简单更改解决了这个问题。
我的问题是我有一个 @Url.Action 并且我已经通过同一属性的值发送了两次
我有同样的问题。从 MVC 3 迁移到 MVC 5 后,我觉得它似乎。
我有自定义编辑器模板,以前必须像这样使用它:
@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField", this.ViewData)
要解决问题,我必须删除传递的 ViewData
对象。所以最后我有:
@Html.EditorFor(model => model.MyProperty, "MyCustomTemplateName", "MyPropertyField")
希望能帮助到你。
我有同样的错误。在我已经认为我的想法坏了之后,因为我已经重命名了几乎所有模型属性,解决方案是删除所有 Syncfusion 控件上的一个引用,并添加对该控件的各个控件的引用。 (来自 Nuget)
在我的情况下,问题的根源是客户端 json 中的重复属性名称,仅区分大小写。
遇到此错误的另一种方法是来自具有未命名列的数据集。将数据集序列化为 JSON 时会引发错误。
该语句将导致错误:
select @column1, @column2
添加列名将防止错误:
select @column1 as col1, @column2 as col2
我有同样的错误,但 b/c 不同的原因。使用实体框架。在分享我的代码和解决方案之前,我还需要在这里添加一件事,我在控制器方法上有一个断点,但它没有在那里中断,只是抛出异常 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 类中删除重复的字段,它就像一个魅力。
我有同样的错误。当我检查代码时,我发现在我的角度(字体端)端声明“GET”请求并在 ASP.net(后端)端声明“POST”请求。在两侧设置 POST/GET 中的任何一个。然后解决了错误。
我遇到了类似的例外。检查所有列是否具有与模型类中的属性名称完全匹配的标题名称(来自数据库中的选择查询)。
我在 DBContext 上遇到了这个问题。当我尝试在包管理器控制台中运行更新数据库以添加迁移时出现错误:
公共虚拟 IDbSet 状态 { 获取;放; }
问题是类型和名称相同。我将其更改为:
公共虚拟 IDbSet 状态 { 获取;放; }
我有这个确切的错误,不是因为属性名称,而是因为具有重复的自定义属性值。
class Person {
[Column("first_name")]
public string FirstName { get; set; }
[Column("first_name"] // I forgot to change the custom attribute value
public string LastName { get; set; }
public static IEnumerable<Name> Names = db.Query<Name>(""); // error
}
就我而言,这是因为我在 for 中使用了 JoinAlias。
foreach (ISearchSpecsFilter item in searchFilter.SpecsFilter) {
if (item.MinValue + item.MinValue != 0) {
result = result
.WithSubquery
.WhereExists(
workDetailEntity
.JoinAlias(j => j.WorkDetailLabel, () => workDetailLabelEntity)
.JoinAlias(j => workDetailLabelEntity.WorkLabel, () => workLabelEntity)
.JoinAlias(j => workDetailLabelEntity.WorkUnitMeasureType, () => workUnitMeasureTypeEntity)
.Where(w => w.Work.WorkId == workEntity.WorkId && w.Value >= item.MinValue && w.Value <= item.MaxValue && workLabelEntity.WorkLabelId == item.WorkLabelId && workUnitMeasureTypeEntity.WorkUnitMeasureTypeId == (int)item.WorkUnitMeasure)
.Select(s => s.Work.WorkId)
);
}
}
我在执行一个Stord 过程时遇到了同样的问题,它已经返回了两个同名的列。在模型类中映射该列时存在冲突。要解决该问题,请始终为返回的列使用唯一名称。