同じキーのアイテムが既に追加されています


135

このエラーが発生するのは、フォームを送信すると、アクションメソッドが呼び出されないためです。

同じキーのアイテムが既に追加されています。

そして例外の詳細:

[ArgumentException:同じキーを持つ項目がすでに追加されています。]
System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)+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 comparer)+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.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システム.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、Object tag)+54
System.Web.Mvc.Async.AsyncResultWrapper。 End(IAsyncResult asyncResult、Objectタグ)+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

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


2
これにコンテキストを追加する必要があります。コントローラーコードを表示し、実行している正確なアクションを説明します。少しデバッグを自分で行って、質問がより冗長になり、コード/スタックの巨大な塊だけではないようにします。
Chev 2011

私は非常によく投稿しているJSONをチェックし、重複したプロパティを見つけました-1つはCustomerIDをつづり、もう1つはCustomerIdをつづりました-私が投稿しているJSONに両方のプロパティが追加されたので、この問題を解決した私。
AVH 2017

回答:


225

ほとんどの場合、同じプロパティを2回含むモデルがあります。おそらくnew、ベースプロパティを非表示にするために使用しています。

解決策は、プロパティをオーバーライドするか、別の名前を使用することです。

モデルを共有すると、さらに詳しく説明できるようになります。


16
C#では、たとえば、variable1とVariable1がある場合(エラーがスローされます)。また、同様のedmx名がないことを確認してください(テーブルの列に「CURRENCY」があり、ナビゲーションプロパティ名の1つが「Currency」でした)
Robert Koch

7
@Naveen Great修正されました!これがどのようにコンパイルされるかはわかりますが、ここではエラーがスローされます。フレームワークの一部(C#とは異なります)では、大文字と小文字が区別されません。
Aliostad

9
誰かが「同じキー」を識別する方法を知っていますか?
ClayKaboom 2014

1
私はいくつかのビューモデルをいじった後にこれを取得し始めました(Idプロパティを追加)。障害は、JSがすでにいくつかのUI管理のためにオブジェクトに「id」(小文字のid)を配置していたことですが、送信すると、JSONオブジェクトには「Id」と「id」の両方のプロパティがあり、同じキーにマップされていました。 ASP.NETのモデルバインダー、したがってこのエラー。
2014

1
PS:これはMVC3では許可されていますが、MVC5では許可されていません。これが変更された理由はわかりません。
ジュリアン、

20

私は同じ問題を抱えていましたが、これが私がそれを解決した方法です。ViewModelに同じ名前の重複するプロパティがありました。1つのプロパティは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; }
}

現在は正常に動作しています。


おかげで、簡単に言うと、これは、ベースとモデルの大文字と小文字が異なる同じ属性名でも発生します。例:Base:User、Model:user
Richard Housham

12

私は同様の問題を抱えていましたが、これは、同じように名前が付けられたパブリックプロパティ(プライベートであるべきでした)が大文字と小文字のみが異なるためであることがわかりました。

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

12

このような2つのモデルプロパティがありました

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

この2つのハハでこのエラーがスローされたのは奇妙です。


6

C#モデルではなく、AJAXを使用して投稿していたjavascriptオブジェクトに問題がありました。バインドにAngularを使用していNotesて、ページに大文字のフィールドがありましたが、C#オブジェクトでは小文字が想定されていましたnotes。より記述的なエラーは確かにいいでしょう。

C#:

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

Angular / Javascript:

<input ng-model="post.Notes" type="text">

2
それは少し違う答えです、私のC#クラスのどれも異なるケースで重複したプロパティを持っていませんが、私のコントローラーに送信されていたJSONはそうしました。...彼らはC#のコードで問題が見つからない場合、それは同じ問題を探して他の人々と便利になることが考え
ジェイソンGoemaat

Goemattと同じです。送信されたJSONオブジェクトには、バインド先のc#オブジェクトがそれらのキーを完全に無視していたにもかかわらず、重複した名前がありましたが、失敗しました。これはばかげている、おそらく私の頭の中のバグです。送信されるJSONオブジェクトを制御していないため、送信されるすべての追加フィールドの内容を説明できません。
kukabuka 2017年

5

私は同じ問題を抱えていました、私はforeach自分のオブジェクトをループして結果をaに追加してDictionary<string, string>いて、 `データベースのキーに重複があります

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

        }

item.x 重複する値がありました


3

私は答えを見つけました。それは変数のためでした。int aやstring aのように。同じ名前の2つの変数がありました。


1

これは、2回追加されたキーを見つけるために私がしたことです。http://referencesource.microsoft.com/DotNetReferenceSource.zipからソースコードをダウンロードし、フレームワークソースをデバッグするようにVSを設定しました。VSで開かれたDictionary.csがプロジェクトを実行し、ページが読み込まれると、行にデバッグが追加されThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);、 'key'値を確認できました。JSONでは、変数の1文字は大文字でしたが、私のモデルでは小文字でした。モデルを修正したところ、同じコードが機能します。


1

これはMVC 5とVisual Studio Express 2013でヒットしましたIndexAttribute。以下のような2つのプロパティがありました。それらの1つをコメントアウトして再コンパイルすると、MVC 5コントローラーとビューの足場が作成され、Entity Frameworkを使用して成功しました。不思議なことに、属性のコメントを外して再コンパイルし、再試行すると、足場は正常に実行されました。

おそらく、基礎となるエンティティデータモデルまたは「何か」がキャッシュ/破損され、削除および再追加するIndexAttributeと、単に「その何か」の再構築がトリガーされました。

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

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

1

MVC 5では、Entity Frameworkモデルへの参照を一時的にコメント化し、プロジェクト側を再コンパイルすると、スキャフォールディング時にこのエラーが発生することがわかりました。足場を終えたら、コードのコメントを外します。

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

1

ここにない答えを追加したいと思います。これは受け入れられた回答と非常に関連していますが、モデルに重複したプロパティはありませんでした。これは私のJavaScriptの問題でした。

サーバーに送り返すためにモデルを再構築しているときに、Ajaxの保存を行っていました。最初にページを初期化したときに、元のモデルを変数に設定しました。

var currentModel = result.Data;

result.Dataはプロパティを持っています:result.Data.Items

それで、しばらくしてから、Ajaxを使用していくつかのことを行い、保存したいと思います。プロセスの一部は、いくつかのサイドプロセスから配列を取得し、それを私のcurrentModel.Itemsプロパティに設定currentModelしてサーバーに送信することです。

ただし、Javascriptでは、代わりに次のようにしました。

currentModel.items = getData();

聞き取れませんでしたが、Visual Studioでは、Javascriptプロパティの最初の文字が自動的に小文字になります(ReSharperの場合もあります)。次に、currentModelにcurrentModel.itemsANDが含まれているため、保存しようとしたときに、OPによって正確なエラーが表示されました。currentModel.Items

「アイテム」から「アイテム」への単純な変更で問題が修正されました。


1

私の問題は、@ Url.Actionがあり、同じプロパティの値を2回送信したことです。


1

私の場合、コードをコンパイルするだけで問題なく実行されます。しかし、サンプルコードのようなディクショナリを持つ静的クラスの静的フィールドの1つを呼び出すと、例外がスローされます。

サンプルコード

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

説明 ADictに「テスト」キーが2回追加されました。したがって、静的クラスを呼び出すと、例外がスローされます。


0

同じ問題がありました。MVC 3からMVC 5に移行した後に表示されました。

カスタムエディターテンプレートがあり、以前は次のように使用する必要がありました。

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

問題を解決するには、通過するViewDataオブジェクトを削除する必要がありました。だから私は最後に:

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

それが役に立てば幸い。


0

同じエラーが発生しました。そして、ほとんどのモデルプロパティの名前を変更したので、心が壊れているとすでに思っていた後、ソリューションはAll Syncfusion Controlsの1つの参照を削除し、このコントロールの個々のコントロールへの参照を追加しました。(Nugetから)


0

私の場合、問題の根本は、大文字と小文字の区別だけが異なるクライアントjsonのプロパティ名の重複でした。


0

このエラーが発生する別の方法は、名前のない列を含むデータセットからです。エラーは、データセットがJSONにシリアル化されるときにスローされます。

次のステートメントはエラーになります。

select @column1, @column2

列名を追加するとエラーが防止されます。

select @column1 as col1, @column2 as col2

0

私は同じエラーがありましたが、差分の理由のb / cです。エンティティフレームワークの使用。コードとソリューションを共有する前にここで追加する必要があるもう1つのことは、コントローラーメソッドにブレークポイントがありましたが、そこではブレークせず、例外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クラスから削除するだけで、魅力的に機能しました。


0

同じエラーが発生しました。コードを確認すると、角度(フォントエンド)側で "GET"リクエストを宣言し、ASP.net(バックエンド)側で "POST"リクエストを宣言していることがわかりました。POST / GETをどちらか一方に設定します。その後、エラーを解決しました。


0

私も同様の例外に直面しました。すべての列に、モデルクラスのプロパティ名と完全に一致するヘッダー名(データベースの選択クエリから)があるかどうかを確認します。


0

DBContextでこの問題が発生しました。パッケージマネージャーコンソールでupdate-databaseを実行して移行を追加しようとすると、エラーが発生しました。

public virtual IDbSet Status {get; セットする; }

問題は、タイプと名前が同じであることでした。私はそれを次のように変更しました:

public virtual IDbSet Statuses {get; セットする; }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.