ASP.Net MVC从Enum字段EF6中使用下拉字段过滤数据

本文关键字:字段 数据 过滤 EF6 MVC Net Enum ASP | 更新日期: 2023-09-27 18:17:26

. Net 4.5 MVC EF6实体框架

我有一个枚举在我的模型。我喜欢通过枚举类型字段上的where子句过滤/排序列表。为此,我创建了一个dropdownfield。我的SelectList:

 var  FGenre = Enum.GetValues(typeof(FileGenre)).Cast<FileGenre>().Select(c => new SelectListItem{ Text = c.ToString(), Value=  c.ToString() });

所以我得到一个列表(value和text是Enum中的文本)。

现在我喜欢用'Where'来过滤我的数据,比如:

var model =  db.Filetypes.Where(fg => fg.FileGenres.Equals(????????).);
  1. 我怎么能建立一个地方克劳斯过滤Enum

  2. 我怎么能得到一个列表的下拉列表与值=值(int)和文本,我怎么能过滤Enum(int)。

我仍然是新的LINQ, Lambda和MVC一般。如果有人有更好的方法,请随时添加您的意见。

编辑:我的模型:

   public partial class Filetype
{
    [Display(Name = "ID")]
    public int FiletypeId { get; set; }
    [StringLength(128)]
    [Display(Name="Datei Art")]
    public string TypeName { get; set; }

    [Display(Name = "Genre")]
    public FileGenre FileGenres { get; set; }
    .......
    public virtual ICollection<FiletypeRole> FiletypeRoles { get; set; }
}
public enum FileGenre
{
    NNB_A,
    NNB_B,
    NNB_C
}  

ASP.Net MVC从Enum字段EF6中使用下拉字段过滤数据

问题是selectlist将枚举表示为字符串,因此您必须在查询中将其转换为enum,这相当难看:

FileGenre MyGenre = (FileGenre) Enum.Parse(typeof(FileGenre), model.FileGenre, true);

因此,可以使用带int值的enum。像这样声明:

public enum FileGenre
{
    NNB_A = 1,
    NNB_B = 2,
    NNB_C = 3
}  

然后填充selectlist(这里我创建了一个返回selectlist的方法):

public SelectList GetAsSelectList()
{
    var enumList = (from Enum e in Enum.GetValues(typeof(FileGenre))
                   select new 
                   {
                       Name = e,
                       Id = Convert.ToInt32(e).ToString()
                   }).ToList();
   return new SelectList((IEnumerable)enumList, "Id", "Name");
}

现在选择列表将有一个int值,当你POST它并在过滤中使用它时将正确绑定:

var model = db.Filetypes.Where(fg => fg.FileGenres == model.FileGenre).ToList();

正如@Alberto提到的,Filetype上的FileGenre属性应该是单数的,因为FileGenres使它看起来像一个集合或列表,这可能会令人困惑。