每当我尝试创建工单时,我的工单优先级也很低。我已经为优先级设置了一个下拉列表,但是在工单上分配优先级似乎不起作用。我怀疑这与我的视图\票证\创建.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
.cspublic 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
模型中的enums
和TicketVM
模型中的不同。
一种选择是在 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 });
}
}
你有两种不同的枚举类型的priority
,TicketVM.Priority
和Models.Priority
,错误消息表明系统无法隐式转换这两种类型。
您只能定义一个枚举类型,并在代码中的任何地方使用它,因此您不需要枚举转换
在 ViewModel 中不需要另一个Priority
枚举。只需使用模型中的一个添加相应的使用引用即可。
但是,如果您仍然需要将一个枚举的值分配给另一个枚举的值,请像Priority=(int)model.priority
这样做。
请注意,您的模型Priority
具有Low=0
、Med=1
、High=2
,而视图模型LOW = 3
、MED = 2
、HIGH = 1
。