为mvc填充下拉列表

本文关键字:下拉列表 填充 mvc | 更新日期: 2023-09-27 18:03:11

我有一个问题,理解MVC和LINQ的一些数据类型和数据集。我正在尝试填充下拉列表。

我收到以下错误(在代码中注意到)

"无法创建类型为'vps_intranet.Models.Part'的常量值。在此上下文中只支持基本类型或枚举类型。"

PartsController.cs

private List<Part> partsNotPartOfStructure(int partID)
{
    Part mainPart = db.Parts.Find(partID);
    //var alreadySelected = db.Parts.Select(p => p.PartStructures_comp).Distinct();
    List<Part> parts = new List<Part>();
    List<PartStructures> excludeList = db.PartStructures1
        .Where(p => p.mainPart_id == partID).ToList();
    parts = db.Parts.Where(c => c.PartStructures_comp
        .Except((List<PartStructures>) excludeList)).ToList();
    //The line above gives the error...
    //Unable to create a constant value of type 'vps_intranet.Models.Part'.
    //Only primitive types or enumeration types are supported in this context.**
    return parts;
}
public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Part part = await db.Parts.FindAsync(id);
    if (part == null)
    {
        return HttpNotFound();
    }
    ViewData["AvailableParts"] = partsNotPartOfStructure(id.Value);
    return View(part);
}

Details.cshtml

@model vps_intranet.Models.Part
@{ 
    var fullList = (IEnumerable< vps_intranet.Models.Part >) ViewData["AvailableParts"];
    var availableParts = fullList.Select(p => new SelectListItem { Text = p.partNo.ToString(), Value = p.id });
}
...
@Html.DropDownListFor(model => model.PartStructures_comp, availableParts));

我需要改变什么?

为mvc填充下拉列表

您正在向Except方法传递PartStructures类对象的列表。Except方法使用默认的相等比较器来比较值。

如果你传递一个自定义类(不是一个简单的值类型,如int ),你应该实现IEqualityComparer<T>接口方法,如EqualsGetHashCode

如果你不喜欢这样做,你可以得到你的PartStructures集合的id,并使用Contains方法。

var excludeIdList = db.PartStructures1.Where(p => p.mainPart_id == partID)
                      .Select(g=>g.Id).ToList();
var parts = db.Parts
          .Where(c => !c.PartStructures_comp.Any(g=>excludeIdList.Contains(g.Id)))
          .ToList();

您正在尝试在两种不同的数据类型之间使用Exclude。你有Part类和List<PartStructure>类。按部分来做。首先,拿到零件。然后,将其强制转换为部件结构列表,然后执行排除操作。

你必须实现IEqualityComparer<T>

摘自:this post.

public class Compare : IEqualityComparer<Part>
{
    public bool Equals(Part x, Part y)
    {
        return x.SomeProperty == y.SomeProperty;
    }
    public int GetHashCode(Part part)
    {
        return part.SomeProperty.GetHashCode();
    }
}

你可以这样做

var parts = db.Parts.Exclude(someList, new Compare());