Это мой первый вопрос по 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)
Любая помощь будет принята с благодарностью. Спасибо за ваше время.