简体   繁体   English

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

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

I am trying to update Enum value which display Status with three value, Open, OnHold, Close我正在尝试更新 Enum 值,它显示三个值的状态, Open, OnHold, Close

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

I assign this value to my Model field and give the default value of Open我将此值分配给我的 Model 字段并给出默认值Open

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

Right now the problem start when I want to update this value, and change from Open to OnHold or Close现在,当我想更新此值并从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);
}

Here is the Upsert method where Status should be updated.这是应更新状态的 Upsert 方法。 So far what I try is this:到目前为止,我尝试的是:

Method 1方法一

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

Method 2方法二

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

Method 3方法三

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

And here is my HTML dropdown这是我的 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>
  • Method 1 doesn't update status at all, and value is always default as it is Open方法1根本不更新状态,值总是默认的,因为它是Open
  • Method 2 same as Method 1方法二与方法一相同
  • Method 3 doesn't work at all too方法3根本不起作用

My question is: How can I update value from enum dropdown menu using?我的问题是:如何使用enum下拉菜单更新值?

Your HTML is not sending any value for ticket status, and the model binder is always using the default initialized value.您的 HTML 没有发送任何票证状态值,并且 model 绑定器始终使用默认的初始化值。

Change the asp-for in select tag from @Model.Ticket to @Model.Ticket.Status -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>

This will give you the string representation of the int value you set to the enum members.这将为您提供设置给枚举成员的int值的字符串表示形式。 You can get the enum string from that and set it to the ticket status, like -您可以从中获取枚举字符串并将其设置为票证状态,例如 -

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

An alternative approach:另一种方法:

For create and edit operation, in your controller you have GET methods that returns the view.对于创建和编辑操作,在您的 controller 中,您具有返回视图的GET方法。 Create a SelectList with your enum member names and add it to the ViewBag -使用您的枚举成员名称创建一个SelectList并将其添加到ViewBag -

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

and in your HTML change the select tag as -并在您的 HTML 中将select标签更改为 -

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

Now you will get the enum member name selected in the dropdown as the value for ticketVM.Ticket.Status in the controller and you don't have to do anything to set this value.现在,您将在下拉列表中选择枚举成员名称作为ticketVM.Ticket.Status中的 ticketVM.Ticket.Status 的值,您无需执行任何操作来设置此值。

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

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