在ASP.NET 4.8的 Razor中为下拉列表设置值

前端开发 2026-07-10

通过Razor将数据绑定到视图时,只有下拉列表不起作用。

我几乎可以获取视图中所有字段的值,除了下拉列表没有随所选值更新。在调试时,我可以确认模型中所有字段的值都存在(包括将用于下拉的那个字段)。

模型:

public class MainViewModel
{
    public string Prop1 { get; set; }
    public ComboList<Code> CodesToSelect { get; set; }
    public List<DetailMainViewModel> Details { get; set; }

    public MainViewModel() 
    {
        FillCombo();
    }

    private void FillCombo()
    {
        CodesToSelect = Helpers.CreateComboCodesToSelect();
    }
}

public class DetailMainViewModel
{
    public string DetailProp1 { get; set; }
    public int DetailProp2 { get; set; }
    public string DetailProp3 { get; set; }
    public Code? SelectedCode { get; set; }
    public DateTime? DetailDate { get; set; }
}

视图:

@model MainViewModel

<div class="col-sm-12">
    <div class="col-sm-12">
        <h5>Title</h5>
    </div>
        <div>
            @for (int i = 0; i < Model.Details.Count; i++)
            {
                <div class="row">
                    <div class="col-sm-1">
                        @Html.LabelFor(d => d.Details[i].DetailProp2, new { @class = "control-label" })
                        @Html.TextBoxFor(d => d.Details[i].DetailProp2, new { @class = "form-control", @readonly = "readonly" })
                    </div>
                    <div class="col-sm-2">
                        @Html.LabelFor(d => d.Details[i].DetailProp3, new { @class = "control-label" })
                        @Html.TextBoxFor(d => d.Details[i].DetailProp3, new { @class = "form-control", @readonly = "readonly" })
                    </div>
                    <div class="col-sm-3">
                        @Html.LabelFor(d => d.Details[i].SelectedCode, new { @class = "control-label" })
                        @Html.DropDownListFor(d => d.Details[i].SelectedCode, Model.CodesToSelect.ToSelectList(), new { @class = "form-control", @readonly = "readonly" })
                    </div>
                    <div class="col-sm-2">
                        @Html.LabelFor(d => d.Details[i].DetailDate, new { @class = "control-label" })
                        @Html.TextBoxFor(d => d.Details[i].DetailDate, new { @class = "form-control", @readonly = "readonly" })
                    </div>
                </div>
            }
        </div>        
</div>

正如前面所说,DetailViewModel的几乎所有字段(DetailProp2DetailProp3DetailData)都已被填充,并在屏幕上正确显示。但 SelectedCode 似乎被忽略,下拉列表总是显示列表中的第一项。还有什么需要做的,以便下拉框能根据 "d.Details[i].SelectedCode" 更新?我在这里还可能遗漏了什么?

这是我在这里的第一篇帖子,请给我任何改进的提示。

解决方案

改用一个SelectList作为替代

public SelectList DetailsDropDown { get; set; }

 public MainViewModel() 
{
    DetailsDropDown = new SelectList((from s in XXX 
                                    select new {ID = x.Id, Des = x.Des})
                                    "Id","Des");
}

在你的HTML页面中按如下操作

 @Html.DropDownListFor(d => d.Details[i].SelectedCode, Model.DetailsDropDown, new { @class = "form-control", @readonly = "readonly", @Value = d.Details[i].SelectedCode })

关键在于这里。把该值添加进去。这对.NET Core有效。如果你使用的是MVC5,还有另一种方法。

@Value = d.Details[i].SelectedCode
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章