Передача IList <Model>в представление и из него: ArgumentException: элемент с тем же ключом уже добавлен. Ключ: разрешить - PullRequest
1 голос
/ 17 апреля 2020

Это мой первый вопрос по StackOverflow, поэтому прошу прощения за любые глупые ошибки. Я пытался отладить это в течение нескольких дней. Я новичок в mvc и .NetCore 2.2 framework, но я провел много часов в целом и специально для этой ошибки, поэтому любая помощь будет принята с благодарностью.

Мне кажется, что так и должно быть быть довольно простым исправлением, но тот факт, что я вообще не использую словарь, делает его намного более запутанным для меня.

Я создаю пользовательский интерфейс, позволяющий пользователям эффективно запрашивать базу данных удобным для пользователя способом. Это включает в себя создание IList. Каждая FilterModel принимает разные входные данные для определенных c атрибутов в БД.

My FilterModel:

 public class FilterModel
    {
        public string title { get; set; }
        public string description { get; set; }
        public int? type { get; set; }
        public bool not { get; set; }
        public string input { get; set; }
        public double fromInput { get; set; }
        public double toInput { get; set; }

        //constructor
        public FilterModel(int typeFilter)
        {
            switch (typeFilter)
            {
                case 0:
                    title = "Keywords";
                    type = typeFilter;
                    not = false;
                    description = "This is a keyword filter";
                    //do i need to initiailize input?
                    break;
                case 1:
                    title = "Engagement";
                    type = typeFilter;
                    not = false;
                    fromInput = 1.0;
                    toInput = 20.0;
                    //do i need to initiailize input?
                    break;
                default:
                    break;
            }
        }
    }

Функция My Search () в контроллере инициализирует IList и передает его моему представлению поиска:

        [HttpGet("/search")]
        public IActionResult Search()
        {
            IList<FilterModel> filters = new List<FilterModel>();


            filters.Add(new FilterModel(0));
            filters.Add(new FilterModel(1));


            return View(filters);

        }

IList может одновременно быть добавлены и удалены пользователем. В данный момент запускается a для l oop и помещает каждый объект в список. Это представление поиска:

@model IList<FilterModel>

@using (Html.BeginForm("/searchresultsnew", "Home", FormMethod.Post))
            {
            <ul class="row sort" id="input-filters" style="list-style-type: none">
                @for (int i = 0; i < Model.Count; i++)
                {
                    @await Html.PartialAsync("_FilterEntryEditor", Model[i]);
                }
                <!--<a alt="Add filter" data-target="#myModal" data-toggle="modal" id="MainNavHelp" href="#myModal" class="mx-2 mb-3 input-cols text-center form-group plus alt"></a>-->
            </ul>

                <div class="col-lg-12 text-center">
                    <button type="submit" class="btn btn-success mt-4 mb-4" id="searchButton">Search</button>

                </div>
            }

Функция PartialAsyn c использует файл _FilterEntryEditor:

@model FilterModel
@using HtmlHelpers.BeginCollectionItemCore


    <li id="filter-li" class="drag col mx-2 mb-3 input-cols text-center form-group" title="" style="cursor:move ">
        @using (Html.BeginCollectionItem("filters"))
        {
            switch (Model.type)
            {
                //Keyword Filter
                case 0:
                    @Html.DisplayFor(Model => Model.title)
                    @Html.TextArea("Description", null, new
                    {
                        @class = "text-input form-control form-control-alternative mt-1 mb-2",
                        @placeholder = "Wellness, fitness, gym rat, etc.",
                        @rows = "8"
                    })

                    @Html.ValidationMessageFor(Model => Model.input)
                    break;

                case 1:
                    @Html.DisplayFor(Model => Model.title)


                    @Html.EditorFor(Model => Model.fromInput, new { @class = "text-input form-control form-control-alternative mt-1 mb-2" })
                    @Html.EditorFor(Model => Model.toInput, new { @class = "text-input form-control form-control-alternative mt-1 mb-2" })
                    @Html.ValidationMessageFor(Model => Model.fromInput)
                    @Html.ValidationMessageFor(Model => Model.toInput)

                    break;
                default:
                    break;
            }
            <a href="#_" onclick="$(this).parent().remove();">Remove</a>
        }
    </li>

После того, как пользователь завершил ввод, форма отправляется в функцию searchresultsnew в контроллере:

        [HttpPost("/searchresultsnew")]
        [HttpGet("/searchresultsnew")]
        public IActionResult SearchresultsNew(IList<FilterModel> filters)
        {

            Debug.WriteLine("Hittt");
            Debug.WriteLine(filters.Count);
            Debug.WriteLine(filters);
            foreach (FilterModel f in filters)
            {
                Debug.WriteLine(f.title);
                Debug.WriteLine(f.title);
                Debug.WriteLine(f.input);
            }

            return View();


        }

Здесь моя ошибка. Ни одна из моих записей консоли отладки не попала. Я пробовал это без BeginCollectionItem также и все еще получаю ту же ошибку. Я выпотрошил большое количество кода, включая большую часть FilterModel. Я также создал EditorTemplate для привязки имени, но это тоже не помогло.

Stack Trace:

System.ArgumentException: An item with the same key has already been added. Key: Allow

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)

   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.Add(String key, StringValues value)

   at Microsoft.AspNetCore.Routing.Matching.HttpMethodMatcherPolicy.<>c__DisplayClass12_0.<CreateRejectionEndpoint>b__0(HttpContext context)

   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)

   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)

   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.Builder.StatusCodePagesExtensions.<>c__DisplayClass6_0.<<UseStatusCodePagesWithReExecute>b__0>d.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

   at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)

   at Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)

   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Любая помощь будет принята с благодарностью. Спасибо за ваше время.

1 Ответ

1 голос
/ 18 апреля 2020

Мне удалось это исправить с помощью какого-то милого джентльмена из разногласия c#.

Моя проблема сводилась к капитализации.

моя функция контроллера SearchresultsNew(), в то время как мой вызов метода был Html.BeginForm("/searchresultsnew", "Home", FormMethod.Post) Я изменил его на Html.BeginForm("SearchresultsNew", "Home", FormMethod.Post)

, и он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...