#c# #jquery #database
Вопрос:
Всем привет, так что я в процессе разработки системы оформления заказа. Прямо сейчас это прекрасно работает, проверяя по одному элементу за раз, но я хотел бы иметь возможность проверять несколько одновременно, используя select2 jquery. У меня это настроено, но по какой-то причине мое свойство элементов списка возвращает значение null вместо хранения элементов, которые я пытаюсь проверить, и я не могу найти исправление. Надеюсь, кто-нибудь сможет мне здесь помочь.
Вот класс модели и модель представления, которые я пробовал:
public class CheckOutItem { private string _timeAsString = ""; public int Id { get; set; } public string Department { get; set; } public string Role { get; set; } public string UserId { get; set; } [NotMapped] public Listlt;stringgt; Items { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(DataFormatString = "{MM/dd/yyyy h:mm tt}")] [Display(Name = "Date Checked Out")] public DateTimeOffset DateCheckedOut { get; set; } = DateTime.Now; } public class CheckOutItemVM { public int Id { get; set; } [ForeignKey("Item")] public int ItemId{ get; set; } public Item Item{ get; set; } [ForeignKey("Employee")] public int EmployeeId { get; set; } public Employee Employee { get; set; } public string Department { get; set; } public string Role{ get; set; } public string UserId { get; set; } [NotMapped] public Listlt;stringgt; Items{ get; set; } [DataType(DataType.DateTime)] [Display(Name = "Date Checked Out")] [DisplayFormat(DataFormatString = "{MM/dd/yyyy h:mm tt}")] public DateTimeOffset DateCheckedOut { get; set; } = DateTime.Now; public Item GetItemInstance() { return new Item { Id = 0, UserId = this.UserId, Department = this.Department, Role = this.Role, DateCheckedOut = this.DateCheckedOut, RecordedTime = this.RecordedTime, Items = this.Items }; } }
Контроллер: «Идентификатор элемента» в пакете просмотра в CheckOutItem () — это строковый идентификатор элемента из класса элемента в таблице базы данных элементов
[HttpGet] public IActionResult CheckOutItems() { ViewBag.ItemId = new SelectList(_db.Items.ToList(), "ItemID", "ItemID"); return View(); } [HttpPost, ValidateAntiForgeryToken] public IActionResult CheckOutItems(CheckOutItemVM iVM) { var checkout = iVM.GetItemInstance(); _itemManage.CheckOutItems(checkout); return View(iVM); }
Вид:
lt;link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet" /gt; lt;script src="https://code.jquery.com/jquery-3.2.1.min.js"gt;lt;/scriptgt; lt;script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"gt;lt;/scriptgt; lt;script type="text/javascript"gt; $(document).ready(function () { $(".itemSelect").select2({ placeholder: "Select Items(s) to CheckOut", tags: true, allowClear: true }); }); lt;/scriptgt; lt;h1gt;@ViewData["Title"]lt;/h1gt; lt;hr /gt; lt;div class="row"gt; lt;div class="col-md-4"gt; lt;form asp-action="CheckOutItems"gt; lt;div asp-validation-summary="ModelOnly" class="text-danger"gt;lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="UserId" class="control-label"gt;User IDlt;/labelgt; lt;input id="UserId" asp-for="UserId" class="form-control" /gt; lt;span asp-validation-for="UserId" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="Department" class="control-label"gt;lt;/labelgt; lt;select asp-for="Department" class="form-control"gt; lt;option selected value=""gt;lt;/optiongt; @foreach (var d in departments) { lt;optiongt;@d.ToString()lt;/optiongt; } lt;/selectgt; lt;span asp-validation-for="Department" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="Role" class="control-label"gt;Rolelt;/labelgt; lt;select asp-for="Role" class="form-control"gt; lt;option selected value=""gt;lt;/optiongt; @foreach (var r in roles) { lt;optiongt;@r.ToString()lt;/optiongt; } lt;/selectgt; lt;span asp-validation-for="Role" class="text-danger"gt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="Items" class="control-label"gt;Items To Checkoutlt;/labelgt; lt;select asp-for="Items" class="itemSelect form-control" name="itemss" multiple asp-items="ViewBag.ItemId"gt; lt;option value="Select Items(s) To Checkout" disabledgt;lt;/optiongt; lt;/selectgt; lt;/divgt; lt;div class="form-group"gt; lt;label asp-for="DateCheckedOut" class="control-label" hiddengt;lt;/labelgt; lt;input asp-for="DateCheckedOut" class="form-control" hidden /gt; lt;span asp-validation-for="DateCheckedOut" class="text-danger" hiddengt;lt;/spangt; lt;/divgt; lt;div class="form-group"gt; lt;input id="onCheckoutSubmit" type="submit" value="Check Out" class="btn btn-primary" /gt; lt;/divgt; lt;/formgt; lt;/divgt; lt;/divgt;
Извините за длинный ответ, но мы высоко ценим любую помощь или предложения 🙂
Я задавал эти вопросы и на других сайтах, но не получил никаких ответов.
Комментарии:
1. Я так и не смог понять, в чем именно заключается ваша проблема.
Items
равно нулю. а) где? (на ваш взгляд, в действии) б) Когда вы что — то делаете-что вы ожидаете там увидеть и почему (как это загружается)? — Было бы полезно, если бы вы описали шаги по воспроизведению проблемы, включая то, что должно произойти в коде.
Ответ №1:
Я не вижу, где создается экземпляр вашего свойства Items, а если это не так, то оно определенно будет равно нулю.
Вы можете создать его экземпляр в конструкторе:
public class CheckoutItem { public CheckoutItem(){ Items = new Listlt;stringgt;(); } }
или непосредственно там, где вы определяете свойство:
public Listlt;stringgt; Items {get; set;} = new Listlt;stringgt;();
Обратите внимание, что коллекции, как правило, не имеют установщиков. Иногда вам это нужно, но часто требуется только a get
. Если вам нужно «сбросить» список, вы можете использовать .Clear()
и .AddRange()
.