【问题标题】:List returning null when value are being passed to it in view with select2使用 select2 将值传递给它时返回 null 的列表
【发布时间】:2021-12-26 00:12:54
【问题描述】:

大家好,我正在开发结帐系统。现在它可以很好地一次签出一个项目,但我希望能够使用 select2 jquery 一次签出多个。我已经设置了它,但由于某种原因,我的 List Items 属性返回 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 List<string> 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 List<string> 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
            };
        }
 }

Controller:CheckOutItem() 中ViewBag 中的“ItemID”是item 数据库表中item 类中的item 的字符串id

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

查看:

 <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" rel="stylesheet" />
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {

        $(".itemSelect").select2({
            placeholder: "Select Items(s) to CheckOut",
            tags: true,
            allowClear: true
        });

    });
</script>
<h1>@ViewData["Title"]</h1>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="CheckOutItems">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="UserId" class="control-label">User ID</label>
                <input id="UserId" asp-for="UserId" class="form-control" />
                <span asp-validation-for="UserId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Department" class="control-label"></label>
                <select asp-for="Department" class="form-control">
                    <option selected value=""></option>
                    @foreach (var d in departments)
                    {
                        <option>@d.ToString()</option>
                    }
                </select>
                <span asp-validation-for="Department" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Role" class="control-label">Role</label>
                <select asp-for="Role" class="form-control">
                    <option selected value=""></option>
                    @foreach (var r in roles)
                    {
                        <option>@r.ToString()</option>
                    }
                </select>
                <span asp-validation-for="Role" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Items" class="control-label">Items To Checkout</label>
                <select asp-for="Items" class="itemSelect form-control" name="itemss" multiple asp-items="ViewBag.ItemId">
                    <option value="Select Items(s) To Checkout" disabled></option>
                </select>
            </div>
            <div class="form-group">
                <label asp-for="DateCheckedOut" class="control-label" hidden></label>
                <input asp-for="DateCheckedOut" class="form-control" hidden />
                <span asp-validation-for="DateCheckedOut" class="text-danger" hidden></span>
            </div>
            <div class="form-group">
                <input id="onCheckoutSubmit" type="submit" value="Check Out" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

抱歉,答案很长,但非常感谢任何帮助或建议:)

我也在其他网站上问过这个问题,但没有收到任何答案。

【问题讨论】:

  • 我无法理解您的问题到底是什么。 Items 为空。 a) 在哪里? (在你看来,在一个动作中) b)当你做什么时——你期望在那里看到什么以及为什么(它是如何加载的)? - 如果您描述重现问题的步骤,包括代码中应该发生的事情,这将有所帮助。

标签: c# jquery database


【解决方案1】:

我没有看到您的 Items 属性在哪里被实例化,如果不是,那么它肯定是 null。

你可以在构造函数中实例化它:

public class CheckoutItem {
    public CheckoutItem(){
        Items = new List<string>();
    }
}

或直接在您定义属性的地方:

public List<string> Items {get; set;} = new List<string>();

附带说明,集合通常没有设置器。有时你需要这个,但通常只需要get。如果需要“重置”列表,可以使用.Clear().AddRange()

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2021-12-11
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多