将视图模型中的枚举绑定到 MVC



每当我尝试创建工单时,我的工单优先级也很低。我已经为优先级设置了一个下拉列表,但是在工单上分配优先级似乎不起作用。我怀疑这与我的视图\票证\创建.cshtml有关

我需要一些澄清以查看我是否正确执行此操作:

我两者都需要吗

在我的模型中,我有一个名为 Ticket 的类,它有枚举优先级

public enum Priority
{
    Low, Med, High
}
public class Ticket
{
  ....
}

配置.cs(用于插入工单数据的代码段)

var tickets = new List<Ticket>
{
    new Ticket {
        UserID = users.Single(s => s.LastName == "Wan").UserID,
        CategoryID = categories.Single(c => c.CategoryName == "Con-X" ).CategoryID,
        Issue = ("Con-X Login Error"),
        Priority = Priority.High
    },
    new Ticket {
        UserID = users.Single(s => s.LastName == "Wan").UserID,
        CategoryID = categories.Single(c => c.CategoryName == "Desktop" ).CategoryID,
        Issue = ("Can't remote access C0123"),
        Priority = Priority.Med
    },
};

在我的视图模型中 TicketVM,我还为优先级设置了枚举。由于我通过以下方式配置我的票证:

            Ticket ticket = new Ticket
            {
                UserID = (int)WebSecurity.CurrentUserId,
                Issue = model.Issue,
                IssuedTo = model.IssuedTo,
                CategoryID = model.CategoryID,
                Priority = model.priority <-- ERROR
            };

错误:

无法隐式转换类型 "娱乐服务票务系统.视图模型.票务VM.优先级" 到 "娱乐服务票务系统.模型.优先级"。一个明确的 转换存在(您是否缺少演员表? 康乐服务票务系统

Views\Ticket\Create.cshtml

    <div class="form-group">
        @Html.DropDownListFor(m => m.priority, Model.PriorityList, "Please select the priority") 
    </div>

ViewModels\TicketVM

.cs
public class TicketVM
{
    public int UserID { get; set; }
    [Required(ErrorMessage = "Please enter the description")]
    public string Issue { get; set; }
    [Display(Name = "Administrator")]
    [Required(ErrorMessage = "Please select the Administrator")]
    public int IssuedTo { get; set; }
    public IEnumerable<SelectListItem> AdministratorList { get; set; }
    public int CategoryID { get; set; }
    public IEnumerable<SelectListItem> CategoryList { get; set; }
    public enum Priority
    {
        LOW = 3,
        MED = 2,
        HIGH = 1,
    }
    public Priority priority { get; set; }
    public IEnumerable<SelectListItem> PriorityList
    {
        get
        {
            var priorityType = typeof(Priority);
            var priorityValues = Enum.GetValues(priorityType).Cast<Priority>();
            var converter = TypeDescriptor.GetConverter(priorityType);
            return
                from priorityValue in priorityValues
                select new SelectListItem
                {
                    Text = converter.ConvertToString(priorityValue),
                    Value = priorityValue.ToString(),
                };
        }
    }
}

票务控制器.cs

public ActionResult Create()
{
    TicketVM model = new TicketVM();
    ConfigureViewModel(model);
    return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(TicketVM model)
{
    if (!ModelState.IsValid)
    {
        model.CategoryList = new SelectList(db.Categories, "CategoryID", "CategoryName");
        ConfigureViewModel(model);
        return View(model);
    }
    Ticket ticket = new Ticket
    {
        UserID = (int)WebSecurity.CurrentUserId,
        Issue = model.Issue,
        IssuedTo = model.IssuedTo,
        CategoryID = model.CategoryID,
        Priority = model.priority <-- ERROR
    };
    db.Tickets.Add(ticket);
    db.SaveChanges();
    return RedirectToAction("Index");
}
private void ConfigureViewModel(TicketVM model)
{
    IEnumerable<User> admins = db.Users.Where(u => u.IsAdministrator).OrderBy(u => u.LastName);
    model.AdministratorList = admins.Select(a => new SelectListItem
    {
        Value = a.UserID.ToString(),
        Text = string.Format("{0} {1}", a.FirstMidName, a.LastName)
    });
    IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName);
    model.CategoryList = categories.Select(a => new SelectListItem
    {
        Value = a.CategoryID.ToString(),
        Text = a.CategoryName.ToString()
    });
}

Ticket 模型中的enumsTicketVM模型中的不同。

一种选择是在 TicketVM 中添加 using 语句,以便使用 RecreationalServicesTicketingSystem.Models 中的enum(并删除 TicketVM 类中的enum定义)

@using RecreationalServicesTicketingSystem.Models
public class TicketVM
{
    ....
    public Priority priority { get; set; } // uses the enum from the Models assembly
}

另一种选择是从其中一个投射到另一个。由于在对象初始值设定项中需要它,因此在控制器中创建一个私有方法来转换值

private Models.Priority CastPriority(ViewModels.TicketVM.Priority value)
{
    Models.Priority priority = Models.Priority.Low;
    Enum.TryParse<Models.Priority>(value.ToString(), out priority);
    return priority;
}

和对象初始值设定项内部

Ticket ticket = new Ticket
{
    ....
    CategoryID = model.CategoryID,
    Priority = CastPriority(model.priority)
};

旁注:您可以简化用于生成IEnumerable<SelectListItem>

的代码
public IEnumerable<SelectListItem> PriorityList
{
    get
    {
        return Enum.GetNames(typeof(Proprity)).Select(e => new SelectListItem() { Text = e, Value = e });
    }
}
似乎

你有两种不同的枚举类型的priorityTicketVM.PriorityModels.Priority,错误消息表明系统无法隐式转换这两种类型。

您只能定义一个枚举类型,并在代码中的任何地方使用它,因此您不需要枚举转换

在 ViewModel 中不需要另一个Priority枚举。只需使用模型中的一个添加相应的使用引用即可。

但是,如果您仍然需要将一个枚举的值分配给另一个枚举的值,请像Priority=(int)model.priority这样做。

请注意,您的模型Priority具有Low=0Med=1High=2,而视图模型LOW = 3MED = 2HIGH = 1

最新更新