[英]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
更改为OnHold
或Close
时,问题就开始了
[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>
Open
Open
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.