【问题标题】:Default selected value in mvc5 dropdownmvc5 下拉列表中的默认选定值
【发布时间】:2017-06-04 15:22:36
【问题描述】:

我有一个绑定到 @Html.dropdownfor 的 linq 查询。如果我为用户的帐户分配一个值并离开页面。当我返回页面时,它的默认值或预选值是“选择一个时间表”,即使我之前分配了一个值。我需要它来预选已经存储在数据库中的值。它是用这个正确预选的

 ScheduleBuilderList = _context.ScheduleBuilder.ToList()

直到我绑定了 LINQ 查询。 如何在不弄乱 LINQ 的情况下将数据库值设置为下拉列表中选择的默认值?

   @Html.DropDownListFor(m => m.ApplicationUser.ScheduleSum, new SelectList(Model.ScheduleBuilderList, "ScheduleSummary", "ScheduleSummary"), "Choose a schedule", new {@class = "form-control", id="dropdown"})

LINQ

ScheduleBuilderList = _context.ScheduleBuilder.Where(s => s.IsScheduleAssigned == false).ToList()

完整的 Actionresult 代码以及下面的建议更改

 public ActionResult  EmployeeDetails(string id, ScheduleBuilder scheduleBuilder, ApplicationUser applicationUser)
{
    var user = _context.Users.SingleOrDefault(e => e.Id == id);

    if (user == null)
    {
        return HttpNotFound();
    }

    var viewModel = new TierViewModel()
    {
        ApplicationUser = user,
        TierLevel = _context.Tier.ToList(),
        ScheduleBuilderList = _context.ScheduleBuilder
            .Where(s => s.IsScheduleAssigned == false)
            .Select(item => new SelectListItem
            {
                Text = item.ScheduleSummary,
                Value = item.ScheduleSummary,
                Selected = item.ScheduleSummary == user.ScheduleSum
            })

    };

    var user1 = _context.Users.ToList();

    var schedule1 = _context.ScheduleBuilder.ToList();

    return View("EmployeeDetails", viewModel);
}

【问题讨论】:

  • 您的新 linq 查询正在过滤存储在数据库中的值。您可能想要 .Where(s => s.IsScheduleAssigned == false || s == currStoredSchedule)。这只是伪代码,因为我们不知道您的 ScheduleBuilderList 长什么样..
  • 当您使用DropDownListFor() 绑定到模型属性时,将忽略设置SelectListItemSelected 值。删除 Selected = item.ScheduleSummary == user.ScheduleSum 行 - 毫无意义。

标签: c# .net asp.net-mvc linq


【解决方案1】:

你可以试试这样的:

var ScheduleBuilderList = _context.ScheduleBuilder
                                  .Where(s => s.IsScheduleAssigned == false)
                                  .Select(item => new SelectListItem
                                  {
                                      Text = item.ScheduleSummary,
                                      Value = item.ScheduleSummary,
                                      Selected = item.ScheduleSummary == "usersvalue"
                                  });

应该将文字“usersvalue”替换为您感兴趣的ApplicationUser.ScheduleSum 的值。然后您也应该更改一下您的视图,如下所示:

@Html.DropDownListFor(m => m.ApplicationUser.ScheduleSum, 
                      Model.ScheduleBuilderList, 
                      "Choose a schedule", 
                      new {@class = "form-control", id="dropdown"})

并且您的模型应该将ScheduleBuilderList 的类型替换为以下类型:

IEnumerable<SelectListItem>

【讨论】:

  • 我不认为我可以声明 ScheduleBuilderList 因为它在视图模型中。为了澄清起见,我在上面发布了完整的 ActionResult 方法以及您建议的代码的屏幕截图。我的 viewModel 中的 ScheduleBuilderList 被列为 public IEnumerable ScheduleBuilderList { get;放; } 抓取下拉项目。
  • @user6680 太好了!您应该在 ViewModel 定义中将此 IEnumerable&lt;ScheduleBuilder&gt; ScheduleBuilderList { get; set; } 更改为 IEnumerable&lt;SelectListItem&gt; ScheduleBuilderList { get; set; }
  • @user6680 您还错过了Selected = s.ScheduleSummary == user.ScheduleSum 之后的一个右花括号。你应该在那里添加这个}
  • 感谢我修复了该部分,但我仍然遇到错误。我更新了上面的代码和截图。我猜第二个屏幕截图错误是因为第一个屏幕截图错误。 “从未使用过属性 ScheduleBuilderList”是我在 viewmodel IEnumerable ScheduleBuilderList { get;放; }
  • @user6680 我的错...抱歉。从代码编辑器中编写代码有点困难 :( 愚蠢的错误...您应该使用 s 而不是 s,因为这是捕获的变量的名称。
猜你喜欢
  • 2014-09-17
  • 2012-01-25
  • 1970-01-01
  • 2017-06-17
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多