如何将我的交付模型中的Enum交付状态值正确映射到Delivery ViewModel?
目前,我在将Enum
值保存到我的数据库时遇到了问题,因为我没有将我的ViewModel
正确映射到我的Model
,反之亦然。当我尝试Edit
现有的Delivery
时,问题在于。它获得status
,但是当我尝试save
它时,它不会save
新的status
。如何将我的交付模型中的Enum交付状态值正确映射到Delivery ViewModel?
此行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>
这是我得到的这条线delivery.status = model.Status;
错误:
您已为Status
声明了2个单独的enums
,其中一个在装配体中用于您的数据模型,另一个用于您的视图模型的装配体中。它们是不同的类型,不能从一个转换到另一个。你可以有视图模型指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;
如果你想最简单的方法让你的ViewModel状态属性字符串或一个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
我已经添加了那行'delivery.Status = model.Status;'但它说不能隐式地将字符串转换为状态,所以我在我的代码中注释掉了。 – mustang00
使用Enum.Parse(typeof(Status),model.Status) –
我无法在编辑中看到您正在模型或视图模型上设置“状态”的任何地方。 –
这是你可以问的最短的问题,还是你没有阅读[问]? – Amit
@CharlesMager,我不知道如何设置使用枚举?我已经看过堆栈中的各种替代方案,但它们似乎很复杂,以至于我无法理解。 – mustang00