C# 如何将枚举传递状态值从传递模型正确映射到传递视图模型?
目前,我在将C# 如何将枚举传递状态值从传递模型正确映射到传递视图模型?,c#,asp.net-mvc,enums,C#,Asp.net Mvc,Enums,目前,我在将Enum值保存到数据库时遇到问题,因为我没有正确地从ViewModel映射到Model,反之亦然。问题在于,当我尝试编辑现有的交付时。它获取状态,但当我尝试保存它时,它不会保存新的状态 此行delivery.status=model.status不起作用,我不知道是否也应该在ViewModel中设置Enum 我很困惑,因为我不知道怎么做。我仍然是一个初学者,所以我正试图把我的头围绕着这个发展,谁能建议一个解决方案或给我指出正确的方向 视图模型: public enum Status
Enum
值保存到数据库时遇到问题,因为我没有正确地从ViewModel
映射到Model
,反之亦然。问题在于,当我尝试编辑现有的交付时
。它获取状态
,但当我尝试保存它时,它不会保存新的状态
此行delivery.status=model.status代码>不起作用,我不知道是否也应该在ViewModel
中设置Enum
我很困惑,因为我不知道怎么做。我仍然是一个初学者,所以我正试图把我的头围绕着这个发展,谁能建议一个解决方案或给我指出正确的方向
视图模型:
public enum Status
{
Dispatched, Delayed, Delivered
}
public class DeliveryVM
{
public int? ID { get; set; }
public int DriverID { get; set; }
public Status Status { get; set; }
}
控制器:
public ActionResult Edit(int? id)
{
....
Delivery delivery = db.Deliverys.Find(id);
// Initialize the view model
DeliveryVM model = new DeliveryVM()
{
ID = delivery.DeliveryID,
DriverID = delivery.DriverID,
Status = model.Status; // this doesn't work
};
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(DeliveryVM model)
{
// Get the data model based on the ID of the view model
Delivery delivery = db.Deliverys.Find(model.ID);
// Map the view model properties to the data model
delivery.DriverID = model.DriverID;
delivery.status = model.Status; // this doesn't work
// Mark as modified and save
....
return RedirectToAction("Details", new { id = delivery.DeliveryID });
}
型号:
public enum Status
{
Dispatched, Delayed, Delivered
}
public class Delivery
{
public int DeliveryID { get; set; }
[Display(Name = "Driver")]
public int DriverID { get; set; }
public Status Status { get; set; }
}
查看代码:
<div class="form-group">
@Html.LabelFor(model => model.Status, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EnumDropDownListFor(model => model.Status, htmlAttributes: new { @class = "form-control", @id="dropdown" })
@Html.ValidationMessageFor(model => model.Status, "", new { @class = "text-danger" })
</div>
</div>
@LabelFor(model=>model.Status,htmlAttributes:new{@class=“controllabel col-md-2”})
@EnumDropDownListFor(model=>model.Status,htmlAttributes:new{@class=“form control”,@id=“dropdown”})
@Html.ValidationMessageFor(model=>model.Status,“,new{@class=“text danger”})
这是我在这一行中得到的错误delivery.status=model.status代码>:
如果您希望以最直接的方式使ViewModel Status属性为字符串或int,并与控制器中的状态进行映射。。。或者在您的数据中选择呼叫(如果必须),就像您现在所做的那样
如果这不是问题所在,因为我看不到您在视图中执行的操作,那么在编辑操作方法中,您不会使用我可以看到的视图模型值更新delivery.Status
Delivery delivery = db.Deliverys.Find(model.ID);
// Map the view model properties to the data model
delivery.DriverID = model.DriverID;
delivery.Dispatched_Date = model.Dispatched_Date;
delivery.Dispatched_Time = model.Dispatched_Time;
delivery.Delivered_Date = model.Delivered_Date;
delivery.Delivered_Time = model.Delivered_Time;
delivery.Delayed_Date = model.Delayed_Date;
delivery.Delayed_Time = model.Delayed_Time;
delivery.Comment = model.Comment;
//where is this?
delivery.Status = model.Status;//do a mapping from int or string if you change VM like i suggested
您已经为状态
声明了两个独立的枚举
,一个在程序集中用于数据模型,另一个在程序集中用于视图模型。它们是不同的类型,不能从一种转换为另一种。您可以让视图模型引用数据模型程序集中的enum Status
,也可以使用enum.TryParse()
方法在它们之间进行映射,例如在GET方法中从数据模型映射到视图模型
HealthHabitat.ViewModels.Status status = HealthHabitat.ViewModels.Status.Dispatched;
Enum.TryParse(delivery.Status.ToString(), out status);
DeliveryVM model = new DeliveryVM()
{
ID = delivery.DeliveryID,
DriverID = delivery.DriverID,
Status = status;
};
然后在POST方法中,以相反的方式进行
HealthHabitat.Models.Status status = HealthHabitat.Models.Status.Dispatched;
Enum.TryParse(model.Status.ToString(), out status);
delivery.Status = status;
在Edit
中,我看不到您正在模型或视图模型上设置状态的任何地方。这是您可以问的最短问题,还是您根本没有阅读?@CharlesMager,我不确定如何使用Enum进行设置?我已经看过了堆栈上的各种备选方案,但它们似乎很复杂,我无法理解。下次我提问时,我会考虑你们的建议。多谢各位@Amit@mustang00-没有不愉快的感觉。我很高兴你看到我的评论对你有帮助。我已经添加了那行delivery.Status=model.Status代码>但是它说不能隐式地将字符串转换为状态,所以我在代码中注释掉了。使用Enum.Parse(typeof(status),model.status)我是否继续使用此行delivery.status=model.status代码>在我的帖子方法中?是否应该更改或删除它?不,您将需要执行与我上面显示的相同的操作,但相反(我将在稍后更新答案)