Список, возвращающий значение null, когда ему передается значение в представлении с помощью select2

#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() .