C# 如何使用带有ViewBag的DropdownListFor指定所选值?

C# 如何使用带有ViewBag的DropdownListFor指定所选值?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,在我看来,我有以下下拉列表: @Html.DropDownListFor(m => item.BillingStatusID, (SelectList)ViewBag.BillingStatusID, "Select...") 我正在使用以下控制器,用于编辑和创建: [HttpGet] public ActionResult Create() { var week = new Week(); ApplicationDbContext db = new Applicatio

在我看来,我有以下下拉列表:

@Html.DropDownListFor(m => item.BillingStatusID, (SelectList)ViewBag.BillingStatusID, "Select...")
我正在使用以下控制器,用于编辑和创建:

[HttpGet]
public ActionResult Create()
{
    var week = new Week();
    ApplicationDbContext db = new ApplicationDbContext();
    var timeEntries = from te in db.TimeEntries
                      select te;

    ViewBag.BillingStatusID = new SelectList(db.BillingStatus, "BillingStatusID", "Name", row.BillingStatusID);

    foreach (TimeEntry t in timeEntries)
    {
        week.TimeEntries.Add(t);
    }

    week.TimeEntries.Add(new TimeEntry { TimeEntryID = -1 });

    return View(week);

}
但是,当页面呈现时,它将所选值显示为“选择…”,而不是该项目的账单状态

所需的结果是页面呈现如下所示:

但它却呈现为这样:

如果我将ViewBag更改为:

 ViewBag.BillingStatusID = new SelectList(db.BillingStatus, "BillingStatusID", "Name", 2);
例如,它可以工作,DropDownListfor中填充了BillingStatusID=2的条目,但显然这不是理想的行为。如何确保从ViewBag正确返回索引

我的怀疑是,我应该以某种方式将变量传递回控制器,但我是MVC新手,所以不确定这应该如何工作

var data=Model.Select(o=> new SelectListItem{
 Value=o.id.toString(),
 Text=o.value,
 Selected=o.id==yourSelectId?true:false
}).toList();
然后 您的查看页面应该是-

<option value="@option.value" selected="option.Selected">@option.text</option>
@option.text

您能详细介绍一下吗?不确定这与我上面的问题有何联系?你的问题标记为重复,你可以查看答案。但在我的情况下,我使用像选择@foreach(ViewBag.Model中的SelectListItem选项){@option.text}@SohelRana,这是错误的代码,永远不会提供真正的双向模型绑定(如果存在,则使用
ModelState
设置值),也不会提供客户端验证)所有这些都意味着将选择该选项(其存在决定是否选择某个选项的属性),只会选择最后一个选项。还要注意,添加第四个参数或
SelectList
构造函数('row.BillingStatusID')是没有意义的,因为它被
DropDownListFor()
忽略。在内部,该方法构建一个新的
IEnumerable
,并根据绑定刚刚实现的
m=>item.BillingStatusID的属性值设置
Selected
属性,这表明您可能在一个
foreach
循环中执行此操作,而该循环无论如何都不会工作-请参阅
foreach
循环将不起作用,并解释如何对集合使用
DropDownListFor()