繁体   English   中英

如何更新 ASP.NET Core MVC 中的枚举值?

[英]How to update Enum value in ASP.NET Core MVC?

我正在尝试更新 Enum 值,它显示三个值的状态, Open, OnHold, Close

public enum TicketStatus
{
    Otvoren = 1,
    NaCekanju = 2,
    Zatvoren = 3
}

我将此值分配给我的 Model 字段并给出默认值Open

public string Status { get; set; } = TicketStatus.Otvoren.ToString();

现在,当我想更新此值并从Open更改为OnHoldClose时,问题就开始了

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Upsert(TicketVM ticketVM)
{
    var users = _unitOfwork.ApplicationUser.GetAll(x => x.Id == x.UserName);
    var userName = User.FindFirstValue(ClaimTypes.Email);
    var user = HttpContext.User.Identity.Name;

    if (ModelState.IsValid)
    {
        if (ticketVM.Ticket.Id == 0)
        {
            ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
            ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
            _unitOfwork.Ticket.Add(ticketVM.Ticket);
        }
        else
        {
            ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
            
            _unitOfwork.Ticket.Update(ticketVM.Ticket);
        }
        _unitOfwork.Save();
        return RedirectToAction(nameof(Index));
    }
    return View(ticketVM);
}

这是应更新状态的 Upsert 方法。 到目前为止,我尝试的是:

方法一

if (ticketVM.Ticket.Status == "Otvoren")
{
    ticketVM.Ticket.Status = TicketStatus.NaCekanju.ToString();
    ticketVM.Ticket.Status = TicketStatus.Zatvoren.ToString();
}
else if (ticketVM.Ticket.Status == "NaCekanju")
{
    ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
    ticketVM.Ticket.Status = TicketStatus.Zatvoren.ToString();
}
else if(ticketVM.Ticket.Status == "Zatvoren")
{
    ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
    ticketVM.Ticket.Status = TicketStatus.NaCekanju.ToString();
}

方法二

if (status == "Otvoren")
{
    status = TicketStatus.Otvoren.ToString();
}
else if (status == "NaCekanju")
{
    status = TicketStatus.NaCekanju.ToString();
}
else if (status == "Zatvoren")
{
    status = TicketStatus.Zatvoren.ToString();
}

方法三

switch (status)
{
    case "Otvoren":
        TicketStatus.Otvoren.ToString();
        break;
    case "NaCekanju":
        TicketStatus.NaCekanju.ToString();
        break;
    case "Zatvoren":
        TicketStatus.Zatvoren.ToString();
        break;
}

这是我的 HTML 下拉菜单

<div class="form-group row">
    <div class="col-4">
        <label>Status Tiketa</label>
    </div>
    <div class="col-8">
        <select asp-for="@Model.Ticket" asp-items="Html.GetEnumSelectList<VmSTicketing.Models.Enum.TicketStatus>()" class="form-control"></select>
    </div>
</div>
  • 方法1根本不更新状态,值总是默认的,因为它是Open
  • 方法二与方法一相同
  • 方法3根本不起作用

我的问题是:如何使用enum下拉菜单更新值?

您的 HTML 没有发送任何票证状态值,并且 model 绑定器始终使用默认的初始化值。

select标记中的asp-for@Model.Ticket@Model.Ticket.Status -

<select asp-for="@Model.Ticket.Status" asp-items="Html.GetEnumSelectList<VmSTicketing.Models.Enum.TicketStatus>()" class="form-control"></select>

这将为您提供设置给枚举成员的int值的字符串表示形式。 您可以从中获取枚举字符串并将其设置为票证状态,例如 -

ticketVM.Ticket.Status = ((TicketStatus)Convert.ToInt32(ticketVM.Ticket.Status)).ToString();

另一种方法:

对于创建和编辑操作,在您的 controller 中,您具有返回视图的GET方法。 使用您的枚举成员名称创建一个SelectList并将其添加到ViewBag -

public IActionResult Create()
{
    ViewBag.StatusList = new SelectList(Enum.GetNames(typeof(TicketStatus)));
    return View();
}

并在您的 HTML 中将select标签更改为 -

<select asp-for="@Model.Ticket.Status" asp-items="ViewBag.StatusList" class="form-control"></select>

现在,您将在下拉列表中选择枚举成员名称作为ticketVM.Ticket.Status中的 ticketVM.Ticket.Status 的值,您无需执行任何操作来设置此值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM