【问题标题】:Why ENUM SelectListItem always show first value in Edit method为什么 ENUM SelectListItem 总是在 Edit 方法中显示第一个值
【发布时间】:2021-04-01 13:09:54
【问题描述】:

我有包含树值的 ENUM 类

public enum TicketStatus
    {
        Open = 1,
        OnHold= 2,
        Close= 3
    }

默认情况下,创建帖子时,它会分配第一个值,即Open。 但是一旦我将值更改为OnHold (2)Close (3),当我调用编辑方法时,它总是显示Open (1)

<div class="form-group row">
                    <div class="col-4">
                        <label>Status Tiketa</label>
                    </div>
                    <div class="col-8">
                        <select asp-for="@Model.Ticket.Status" asp-items="Html.GetEnumSelectList<VmSTicketing.Models.Enum.TicketStatus>()" class="form-control"></select>
                    </div>
                </div>

我试图改变这个像

REFERENCE

根据这篇文章的一些答案,我改变了一些类似

@Html.DropDownList("TicketStatus",
                            Html.GetEnumSelectList<VmSTicketing.Models.Enum.TicketStatus>(),
                            "Select Gender", new { @class = "form-control" })

还有这个

 @Html.DropDownListFor(m => m.Ticket.Status, Html.GetEnumSelectList<VmSTicketing.Models.Enum.TicketStatus>())

这是控制器动作

public IActionResult Upsert(int? Id)
        {
            TicketVM ticketVM = new()
            {
                Ticket = new Ticket(),
                TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
                {
                    Text = i.Name,
                    Value = i.Id.ToString()
                }),
                ApplicationUser = new ApplicationUser(),
                Client = new Client()
            };
            var userName = User.FindFirstValue(ClaimTypes.Email);
            var user = HttpContext.User.Identity.Name;

            ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);

            if (Id == null)
            {
                return View(ticketVM);
            }

            ticketVM.Ticket = _unitOfwork.Ticket.Get(Id.GetValueOrDefault());

            if (ticketVM.Ticket == null)
            {
                NotFound();
            }
            return View(ticketVM);
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Upsert(TicketVM ticketVM)
        {
            var userName = User.FindFirstValue(ClaimTypes.Email);
            var user = HttpContext.User.Identity.Name;
            if (ticketVM.Ticket.UserId > 0)
            {
                var usert = _db.ApplicationUsers.FirstOrDefault(u => u.Id == ticketVM.Ticket.UserId);
                ticketVM.Ticket.ApplicationUser = usert;
            }
            else
            {
                var usert = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
                ticketVM.Ticket.ApplicationUser = usert;
            }
            if (ModelState.IsValid)
            {
                if (ticketVM.Ticket.Id == 0)
                {
                    ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
                    _unitOfwork.Ticket.Add(ticketVM.Ticket);
                }
                else
                {

                    //ticketVM.Ticket.Status = ((TicketStatus)Convert.ToInt32(ticketVM.Ticket.Status)).ToString();
                    _unitOfwork.Ticket.Update(ticketVM.Ticket);
                    if (ticketVM.Ticket.Status.ToString() == "1")
                    {
                        ticketVM.Ticket.Status = "Otvoren";
                    }
                    else if (ticketVM.Ticket.Status.ToString() == "2")
                    {
                        ticketVM.Ticket.Status = "NaCekanju";
                    }
                    else if (ticketVM.Ticket.Status.ToString() == "3")
                    {
                        ticketVM.Ticket.Status = "Zatvoren";
                    }
                }
                _unitOfwork.Save();
                return RedirectToAction(nameof(Index));
            }
            else
            {
                ticketVM.TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
                {
                    Text = i.Name,
                    Value = i.Id.ToString()
                });

                if (ticketVM.Ticket.Id != 0)
                {
                    ticketVM.Ticket = _unitOfwork.Ticket.Get(ticketVM.Ticket.Id);
                }
            }
            return View(ticketVM);
        }

这可能是什么问题?我做错了什么?

【问题讨论】:

    标签: c# entity-framework .net-core asp.net-core-mvc


    【解决方案1】:

    你必须像这样使用 util:

    public static SelectList GetSelectList(IEnumerable<SelectListItem> values, string selectedText)
    {
        foreach (var item in values)
        {
            if(item.Text==selectedText) item.Selected=true;
        }
        return new SelectList(values);
    }
    

    将 ticketVM.TicketTypeList 的类型更改为 SelectList 并分配它:

    var typeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
                    {
                        Text = i.Name,
                        Value = i.Id.ToString()
                    }).ToArray();
    
    ticketVM.TicketTypeList = GetSelectList(typeList,ticketVM.Ticket.Status);
    

    在视图中使用它:

    @Html.DropDownListFor(m => m.Ticket.Status, Model.TicketTypeList , "Select")
    

    【讨论】:

    • 感谢您的回答,但这里有一个小错误。 TicketTypeList 与工单状态没有任何关系。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多