【问题标题】:Unable to add conditional first entry to selectlist drop-down menu无法将条件第一个条目添加到选择列表下拉菜单
【发布时间】:2016-06-17 16:52:46
【问题描述】:

项目:

  • ASP.NET 4.5.2
  • MVC 5

我似乎完全无法以有条件的方式将第一个条目添加到选择列表中。

下面是我的代码:

public SelectList getStatus(Guid company) {
  var statusValue = db.Company.Where(x => x.CompanyId.Equals(company)).Select(x => new { CompanyStatusId = x.CompanyStatusId }).SingleOrDefault();
  var statusList = db.CompanyStatus.Select(x => new { CompanyStatusId = x.CompanyStatusId, CompanyStatusName = x.CompanyStatusName }).ToList();
  var status = new SelectList(statusList, "CompanyStatusId", "CompanyStatusName", statusValue);
  if(statusValue.CompanyStatusId.Equals(Guid.Empty) || statusValue.CompanyStatusId.Equals(null)) {
    var insertItem = new SelectListItem { Value = "", Text = " « ‹ Select a Status › » " };
    status.ToList().Add(insertItem);
  }
  return status;
}

在方法内通过行号演练:

  1. 从 Company 表中获取 CompanyStatusId。这是一个外键 查找表。
  2. 获取提供外键的查找表。
  3. IF 语句:如果 CompanyStatusId 为 null 或空白或为空 Guid,添加一个带有空白值的初始“选择状态”条目。

我想要这样做的原因是,任何已经拥有状态的公司都不会获得“选择状态”条目,但任何没有获得该条目的公司。但是,我上面的内容不起作用。我已经通过断点确认 Guid 的 null 值确实会触发 If 语句(至少这样可以工作)并且 IF 语句的内容确实得到处理,但生成的下拉菜单没有“选择状态”条目。

这一切都位于 BaseController 中,因为它需要可从大量内部页面访问。前端的下拉列表由来自此 BaseController 的 ViewBag 填充。

帮助?

【问题讨论】:

  • status.ToList() 正在创建一个新的 List<SelectListItem> (并且您将新项目添加到其中,而不是 SelectList
  • 我不知道如何纠正这个问题。这就是我首先提出这个问题的原因。

标签: asp.net-mvc linq lambda asp.net-mvc-5 selectlist


【解决方案1】:

status.ToList().Add(insertItem); 首先生成一个新的List<SelectListItem> 并将insertItem 添加到其中。它不会改变原来的SelectList。为了使这项工作,将方法更改为

public List<SelectListItem> getStatus(Guid company) // change signature
{
    var statusValue = db.Company.Where(x => x.CompanyId.Equals(company)).Select(x => new { CompanyStatusId = x.CompanyStatusId }).SingleOrDefault();
    var statusList = db.CompanyStatus.Select(x => new { CompanyStatusId = x.CompanyStatusId, CompanyStatusName = x.CompanyStatusName }).ToList();
    var status = new SelectList(statusList, "CompanyStatusId", "CompanyStatusName", statusValue).ToList(); // change
    if(statusValue.CompanyStatusId.Equals(Guid.Empty) || statusValue.CompanyStatusId.Equals(null))
    {
        var insertItem = new SelectListItem { Value = "", Text = " « ‹ Select a Status › » " };
        status.Add(insertItem); // change
    }
    return status;
}

旁注:通常“选择状态”选项是第一个选项,在这种情况下,您需要使用status.Insert(0, insertItem);

另请注意,如果您绑定到模型属性(DropDownListFor() 方法忽略了它),则在 SelectList 构造函数(即 statusValue)中添加最后一个参数是没有意义的。

【讨论】:

  • 好吧,这……成功了。从技术上讲。所以“选择状态”现在在列表中,但它不仅位于列表的最后(因此当没有项目具有选定值时,它不会显示为第一个默认可见值),而是对于已显示其状态的公司,它不再被选为默认选项。嗯...
  • 啊哈!将其更改为 status.Insert(0, insertItem); 有效!
  • 你知道,我没有使用DropDownListFor,我只是使用DropDownList,因为我使用的是ViewBag而不是模型。
  • 畏惧。您应该始终使用强类型 xxxxFor() 方法,并且最好始终使用视图模型。
  • 解决了这个问题。我的statusValue 是不必要的复杂。我将传入的 Guid 名称从company 更改为id,然后将statusValue 行与Company company = db.Company.Find(id); 交换。然后我用company.CompanyStatusId 更改了statusValue 的每个实例,事情开始正常工作。现在,如果设置了状态 ID,下拉菜单会选择正确的项目。至于您的强类型参数,您是否碰巧有一个链接可以很好地解释为什么 vs ViewBags?
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2017-09-19
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多