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在我的帖子方法中?是否应该更改或删除它?不,您将需要执行与我上面显示的相同的操作,但相反(我将在稍后更新答案)