【问题标题】:Binding Enums in Viewmodels to MVC将 Viewmodel 中的枚举绑定到 MVC
【发布时间】:2016-03-20 22:27:16
【问题描述】:

每当我尝试创建票证时,我的票证优先级也是 LOW。我已经为优先级设置了一个下拉列表,但票证上的优先级分配似乎不起作用。我怀疑它与我的 Views\Ticket\Create.cshtml

我需要澄清一下,看看我这样做是否正确:

两个都需要吗

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

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

Configuration.cs(用于插入工单数据的sn-p)

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
            };

错误:

不能隐式转换类型 'RecreationalServicesTicketingSystem.ViewModels.TicketVM.Priority' 'RecreationalServicesTicketingSystem.Models.Priority'。显式 存在转换(您是否缺少演员表?) 娱乐服务票务系统

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(),
                };
        }
    }
}

TicketController.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()
    });
}

【问题讨论】:

  • 你还没有删除POST方法中model.CategoryList = new SelectList(...)这行代码:)

标签: c# asp.net-mvc enums


【解决方案1】:

您的Ticket 模型和TicketVM 模型中的enums 不一样。

一种选择是在 TicketVM 中添加 using 语句,以便您使用来自 RecreationalServicesTicketingSystem.Modelsenum(并删除 enum 类中的 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&lt;SelectListItem&gt; 的代码简化为

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

【讨论】:

  • 使用第二个选项是否会导致我的票证数据在第一次迁移时出现任何错误?(请参阅 configuration.cs)。另外,我将第二个选项的代码放在哪里? med 和 high 也必须这样做吗?
  • Q1:不,因为您没有更改数据模型。 Q2:只需将Priority = model.priority &lt;-- ERROR 替换为我展示的 3 行代码即可。 Q3:没有。第一行代码只是设置了一个默认值。第二行代码将视图模型枚举的值转换为数据模型枚举,因此它的TicketVM.Priority.High,然后priority 的值将是Models.Priority.High
  • 我收到一堆错误,但我怀疑这是因为您在末尾添加了分号而不是逗号? pastebin.com/TUFeNwDu
  • 好的,抱歉 - 您需要将其重构为单独的方法才能在对象初始化程序中使用它。给我一点时间测试一下,我会更新答案
  • 我需要为我的编辑 POST 和 GET 方法执行此操作吗?我收到一个错误(检查 Pastbin)Member Priority cannot be initialized . It is not a field or propertyTicket does not contain the definition for 'priority'Priority cannot reference a type through an expression; Try TicketVm.Priority insteadpastebin.com/eqdscwHW
【解决方案2】:

您似乎有两种不同的枚举类型priorityTicketVM.Priority&Models.Priority,并且错误消息表明系统无法隐式转换这两种类型。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 2011-12-21
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多