如何将我的交付模型中的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;错误:

enter image description here

+0

我无法在编辑中看到您正在模型或视图模型上设置“状态”的任何地方。 –

+0

这是你可以问的最短的问题,还是你没有阅读[问]? – Amit

+0

@CharlesMager,我不知道如何设置使用枚举?我已经看过堆栈中的各种替代方案,但它们似乎很复杂,以至于我无法理解。 – mustang00

您已为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; 
+0

我是否继续在我的POST方法中使用此行'delivery.status = model.Status;'?是否应该更改或删除? – mustang00

+0

不,你需要做同样的事情,我上面显示,但相反(我会稍后更新答案) –

+0

史诗。谢谢! – mustang00

如果你想最简单的方法让你的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 
+0

我已经添加了那行'delivery.Status = model.Status;'但它说不能隐式地将字符串转换为状态,所以我在我的代码中注释掉了。 – mustang00

+1

使用Enum.Parse(typeof(Status),model.Status) –