C# 模板视图模型';在视图中渲染时,s SelectList属性被神奇地选中

C# 模板视图模型';在视图中渲染时,s SelectList属性被神奇地选中,c#,jquery,asp.net-mvc,entity-framework,automapper,C#,Jquery,Asp.net Mvc,Entity Framework,Automapper,我有一个主细节视图,允许用户通过jQuery DOM操作0动态添加子记录,然后将整个主细节表单发布回我的HttpPostEdit方法。我的主视图模型如下所示: public class FooViewModel { // Other properties skipped for brevity public ICollection<BarViewModel> Bars { get; set; } } 在调试器中,我确保当我的编辑操作方法触发GET请求时,BazSel

我有一个主细节视图,允许用户通过jQuery DOM操作0动态添加子记录,然后将整个主细节表单发布回我的
HttpPost
Edit
方法。我的主视图模型如下所示:

public class FooViewModel
{
    // Other properties skipped for brevity
    public ICollection<BarViewModel> Bars { get; set; }
}
在调试器中,我确保当我的
编辑
操作方法触发GET请求时,
BazSelectList
中的所有
SelectListItem
都具有
Selected
属性值
false
。然后呈现我的视图:

@model FooViewModel

@using (Html.BeginForm())
{
    @*Other properties skipped for brevity*@

    @*Model binding magic here, editor template rendered for each BarViewModel*@
    @Html.EditorFor(m => m.Bars)

    <button type="button" class="btn btn-default">Add Bar</button>
}

@* BarViewModel template here *@
@Html.Partial("EditorTemplates/BarViewModel",
              (BarViewModel)ViewBag.BarTemplateViewModel)

当视图呈现时,
ViewBag.BarTemplateViewModel.BazSelectList
在不应该选择的时候选择了一个
SelectListItem
,因为我正在将一个空的
BarViewModel
实例传递给
ViewBag
。这一点已得到确认,因为当我单击“添加栏”按钮时,我可以看到
BazSelectList
被预先选中。预期的行为是有一个未选择的下拉列表。有人能帮忙吗?

最终我找到了解决办法。将
IEnumerable
包装为调用
SelectList
构造函数解决了我的问题,即更改此选项:

@Html.DropDownListFor(m => m.BazId, 
                      Model.BazSelectList,
                      string.Empty,
                      new { @class = "form-control" })


您没有包含足够的代码来理解。您在哪里以及如何生成下拉列表,以及什么是
GetBazSelectList()
@StephenMuecke,我认为它与
GetBazSelectList
方法无关,由于调试器显示在控制器中设置断点时未选择任何
SelectListItem
s…但是,当我在
Edit
视图中设置断点时,选择了其中一个选项。您是否使用强类型帮助器?您绑定的属性值是否与其中一个
SelectListItem
的值匹配?为什么您认为预期的行为是有一个未选择的下拉列表?您是否使用了接受
选项标签的重载?
?我希望模板的下拉列表不会被选中,因为我将空视图模型传递给了
视图包。但是我当然希望
FooViewModel.bar
的下拉列表中应该填充相应的所选值您确定
GetBazSelectList
生成的选项中没有一个值为
0
?使用您的代码进行测试(仅使用
Html.Partial()
BazSelectList
的一些伪值),如果
SelectListItems
中没有
Value=“0”
,则选择“empty”选项。
@model FooViewModel

@using (Html.BeginForm())
{
    @*Other properties skipped for brevity*@

    @*Model binding magic here, editor template rendered for each BarViewModel*@
    @Html.EditorFor(m => m.Bars)

    <button type="button" class="btn btn-default">Add Bar</button>
}

@* BarViewModel template here *@
@Html.Partial("EditorTemplates/BarViewModel",
              (BarViewModel)ViewBag.BarTemplateViewModel)
@model BarViewModel

<div class="form-group">
    @Html.LabelFor(m => m.BazId, new { @class = "col-md-5 control-label" })
    <div class="col-sm-6">
        @Html.DropDownListFor(m => m.BazId, 
                              Model.BazSelectList,
                              string.Empty,
                              new { @class = "form-control" })
    </div>
</div>
@Html.DropDownListFor(m => m.BazId, 
                      Model.BazSelectList,
                      string.Empty,
                      new { @class = "form-control" })
@Html.DropDownListFor(m => m.BazId, 
                      new SelectList(Model.BazSelectList, "Value", "Text"), 
                      string.Empty,
                      new { @class = "form-control" })