问题描述
每当我提交表单时,都会收到此错误,并且由于以下原因未调用action方法:
具有相同键的项目已被添加。
以及异常详细信息:
[ArgumentException:带有
相同的密钥已被添加。]
System.ThrowHelper.ThrowArgumentException(ExceptionResource
资源)+52
System.Collections.Generic.Dictionary`2.Insert(TKey
键,TValue值,布尔值添加)
+9382923 System.Linq.Enumerable.ToDictionary(IEnumerable`1
源,Func`2 keySelector,Func`2
elementSelector,IEqualityComparer`1
比较器)+252
System.Linq.Enumerable.ToDictionary(IEnumerable`1
来源,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,对象模型)+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,字符串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,对象标记)+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
步骤,布尔值和已完成同步)
+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>
<%} %>
解决方法
您最有可能拥有两次包含相同属性的模型。也许您正在使用ѭ1来隐藏基本属性。
解决方案是覆盖属性或使用其他名称。
如果您共享您的模型,我们将能够详细说明。
,我遇到了同样的问题,这就是我解决的方法。我的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; }
}
现在工作正常。
,我有一个类似的问题,发现这是因为我有一个类似命名的公共财产(应该是私有的),只是大小写有所不同。
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;}
,我有2个这样的模型属性
public int LinkId {get;set;}
public int LinkID {get;set;}
奇怪的是,这两个哈哈引发了这个错误。
,我的问题不在我的C#模型中,而在我使用AJAX发布的javascript对象中。我使用Angular进行绑定,并且页面上有一个大写的Notes
字段,而我的C#对象期望使用小写的notes
。一个更具描述性的错误肯定会很好。
C#:
class Post {
public string notes { get; set; }
}
Angular / Javascript:
<input ng-model=\"post.Notes\" type=\"text\">
,我找到了答案,这是因为变量。像int和字符串a。有两个同名变量。
,我遇到了同样的问题,我在对象上循环了foreach
,然后将结果添加到了Dictionary<string,string>
中,并且数据库中的键重复了。
foreach (var item in myObject)
{
myDictionary.Add(Convert.ToString(item.x),item.y);
}
item.x
具有重复值
,这是我做的工作,目的是找出两次被添加的密钥。我从http://referencesource.microsoft.com/DotNetReferenceSource.zip下载了源代码,并设置了VS以调试框架源。在VS中打开Dictionary.cs来运行项目,页面加载后,在第15行添加了调试,并能够看到\'key \'值。我意识到在JSON中,变量的一个字母为大写字母,但在我的模型中为小写字母。我修复了模型,现在相同的代码起作用了。
,我在MVC 5和Visual Studio Express 2013中实现了这一点。我有两个属性,分别为IndexAttribute
,如下所示。注释掉其中之一并重新编译后,将成功使用Entity Framework为MVC 5控制器提供视图。奇怪的是,当我取消注释该属性,重新编译并再次尝试时,脚手架运行得很好。
可能底层的实体数据模型或“某物”已被缓存/损坏,删除并重新添加“ 16”只是触发了该“物”的重建。
[Index(IsUnique = true)]
public string Thing1 { get; set; }
[Index(IsUnique = true)]
public string Thing2 { get; set; }
,在MVC 5中,我发现暂时注释掉对Entity Framework模型的引用,并在脚手架时重新编译项目侧会导致此错误。一旦完成脚手架,我便不会注释代码。
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
拥有财产::22ѭ
因此,一段时间后,我做了一些事情,并希望通过Ajax保存。该过程的一部分是从某个过程中获取一个数组,并将其设置为我的currentModel.Items
属性,然后将currentModel
发送到服务器。
但是,在我的Javascript中,我这样做是:
currentModel.items = getData();
我没听懂,但是在Visual Studio中,它将自动小写Javascript属性的首字母(这也可能是ReSharper的东西)。然后,我尝试保存时得到了OP发布的确切错误,因为currentModel现在有currentModel.items
和currentModel.Items
从\“ items \”更改为\“ Items \”的简单更改解决了该问题。
,我的问题是我有一个@ Url.Action,并且两次通过同一属性的值发送
,我有同样的问题。从MVC 3迁移到MVC 5后,它似乎对我而言。
我有自定义编辑器模板,之前必须像这样使用它:
@Html.EditorFor(model => model.MyProperty,\"MyCustomTemplateName\",\"MyPropertyField\",this.ViewData)
要解决此问题,我必须删除传递的“ 29”对象。所以最后我有了:
@Html.EditorFor(model => model.MyProperty,\"MyPropertyField\")
希望能帮助到你。
,我有同样的错误。在我已经确定自己的想法已经崩溃之后,因为我已经重命名了几乎所有的模型属性,所以解决方案是删除“所有Syncfusion控件”上的一个引用,并为该控件的各个控件添加引用。 (来自Nuget)
,就我而言,问题的根源是客户端json中的重复属性名称,只是区分大小写而有所不同。
,遇到此错误的另一种方法是来自具有未命名列的数据集。将数据集序列化为JSON时会引发错误。
此语句将导致错误:
select @column1,@column2
添加列名将防止错误:
select @column1 as col1,@column2 as col2
,我有相同的错误,但差异原因是b / c。使用实体框架。在共享我的代码和解决方案之前,我还需要在这里添加一件事,我在控制器方法上有一个断点,但是它并没有中断,只是抛出了异常500内部服务器错误。
我正在通过ajax将数据从视图发布到控制器(http发布)。我期望作为参数的模型是一个类。它是与其他一些类一起继承的。
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类中删除重复的字段,它就像一个魅力。
,就我而言,仅当您编译代码时,它就可以正常运行。但是,调用具有字典(如示例代码)的静态类的静态类的静态字段之一会引发异常。
样例代码
public static AClass
{
public static Dictionary<string,string> ADict = new Dictionary<string,string>()
{
{\"test\",\"value1\"},{\"test\",\"value2\"},};
}
说明
ADict已两次添加“测试”键。因此,当您调用静态类时,它将引发异常。
,我有同样的错误。当我检查代码时,我发现在我的有角(字体端)一侧声明了“ GET”请求,并在ASP.net(后端)侧声明了“ POST”请求。在两侧都设置POST / GET。然后解决了错误。