应用过滤以生成下拉列表

本文关键字:下拉列表 过滤 应用 | 更新日期: 2023-09-27 18:16:23

我有以下类,并希望根据特定条件过滤下拉列表。

模型类

public class Option
{
    public int OptionID { get; set;}
    public string OptionName { get; set; }
    public int TechnicalCharacteristicID { get; set; }
    public int LsystemID { get; set; }
    public virtual ICollection<OptionValue> OptionValues { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
    public virtual Lsystem Lsystem { get; set; }
}
public class OptionValue
{
    public int OptionValueID { get; set; }
    public string OptionVal { get; set; }
    public int OptionID { get; set; }
    public virtual Option Option { get; set; }
    public virtual ICollection< SetValue> SetValue { get; set; }
}
public class SetValue
{
    public int SetValueID { get; set; }
    public string Value { get; set; }
    public bool Status { get; set; }
    public int TcSetID { get; set; }
    public int OptionValueID { get; set; }
    public virtual OptionValue OptionValue { get; set; }
    public virtual TcSet TcSet { get; set; }
}
public class TcSet
{
    public int TcSetID { get; set; }
    public string SetName { get; set; }
    [Display(Name = "PhysicalUnit")]
    public string PhysicalUnit { get; set; }
    public int TechnicalCharacteristicID { get; set; }
    public int DataFormatID { get; set; }
    public virtual ICollection<SetValue> SetValues { get; set; }
    public virtual DataFormat DataFormat { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
}
public class TechnicalCharacteristic
{
    public int TechnicalCharacteristicID { get; set; }
    public string TCName { get; set; }
    public virtual ICollection<TcSet> TcSets { get; set; }
    //public virtual ICollection<Option> Options { get; set; }
}

我想要实现的

我想在SetVal中保存每个选项的值。SetVal中生成的下拉列表需要根据以下条件进行过滤(我无法实现该条件,因为它使用了来自其他类的参数)

 OptionValue.Option.TechnicalCharacteristicID == TcSet.TCID

我有以下控制器类。我将选择条件等同于预设值,因为我无法匹配选择条件的右侧。

我需要在表中显示选择的结果。当我试图解决现有的结果表,它显示的类型不是IEnumerable,即使它在模型类中声明IEnumerable .

控制器

    public ActionResult Create(int OptionValID, int OptionID)
    {
        var model = new SetValue
        {
            OptionValueID = OptionValID
        };
        //var tcid = 
       // ViewBag.OptionValueID = new SelectList(db.OptionValue, "OptionValueID", "OptionVal");
        var tcSet = db.SetValue.Include(x=>x.TcSet).FirstOrDefault(x=>x.OptionValue.Option.TechnicalCharacteristicID==4);
        if (tcSet!=null)
        {
            model.TcSet = tcSet.TcSet;
        }
        ViewBag.TcSetID = new SelectList(db.TcSet, "TcSetID", "SetName");
        return View(model);
    }

Create的参数来自Option Value控制器的函数调用。参数为OptionValueIDOptionID

我不知道我是否有完成这项任务的正确方法。

附加评论

即使使用预设值,列表也不起作用。没有编译或运行时错误

<<p> 调试细节/strong>

我从select语句中得到两个值,但是这两个值是相同的。它只对应于所需表中该行的第一个值。

应用过滤以生成下拉列表

使用以下代码生成选择列表数据

    public IEnumerable<SelectListItem> SelectList()
    {
        List<SelectListItem> selectList = new List<SelectListItem>();
        var listOfCat1 = db.TcSets.ToList();
        if (listOfCat1 != null)
        {
            if (listOfCat1.Count>0)
            {
                foreach (var item in listOfCat1)
                {
                    SelectListItem sVM = new SelectListItem();
                    sVM.Value = item.Id.ToString();
                    sVM.Text = item.Name;
                    selectList.Add(sVM);
                }
            }
        }
        return selectList.AsEnumerable();
    }

然后,在调用视图

之前,将以下代码放入控制器中
    ViewBag.ProductCategoriesList = SelectList();

在视图中,用以下代码行调用下拉列表

   <div class="form-group" >
      @Html.LabelFor(model => model.TcSetID , "Product Category", htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
       @Html.DropDownListFor(x => x.TcSetID , @ViewBag.ProductCategoriesList as IEnumerable<SelectListItem>, "--- Select Tc Set  ---", new { @class = "form-control", @style = "background-color:yellow;border-color:royalblue" })
          @Html.ValidationMessageFor(model => model.TcSetID , "", new { @class = "text-danger" })
      </div>
  </div>