我的视图模型中有一个实体列表:
public class ViewModel {
public int SelectedItem {get; set;}
public List<Meeting> Meetings {get; set;}
}
public class Meeting {
public int Id {get; set;}
public string Title {get; set;}
public string Info {get; set;}
}
在我看来,我有一个下拉列表用作列表框(将大小设置为 10),并且我正在缩短选择列表的创建,正如我在一些示例中看到的那样:
@Html.DropDownListFor(model => model.SelectedItem,
new SelectList(Model.Meetings, "Meeting.Id", "Meeting.Title"),
new {@id="itemList"})
当 Meetings 是一个空列表时,这在我的第一个页面加载时有效。但是一旦 Meetings 被填充,我就会得到一个 reference is not set to instance of object 错误。我以类似的想法将选择列表的创建移动到我的控制器中:
ViewBag.mySelectList = new SelectList(ViewModel.Meetings, "Meeting.Id", "Meeting.Title")
在调试器中,我看到选择列表在那里并包含会议列表,但结果视图返回错误。当我像往常一样创建它时:
var selList = Meetings.Select(m => new SelectListItem {
Value = m.Id.ToString(),
Text = m.Title}).ToList();
mySelectList = new SelectList(selList, "Value", "Text");
然后将视图模型(mySelectList 在视图模型中用于此工作)返回到它工作的视图。这似乎是正确的方法,但看到像我上面的视图代码示例让我对更小的视图模型和控制器代码充满希望。在我没有看到的 Razor 页面中动态创建 SelectList 是否有一些技巧?
用
nameof
表达式替换字符串“Meeting.Id”和“Meeting.Title”。 nameof
表达式中的值没有引号。
@Html.DropDownListFor(model => model.SelectedItem,
new SelectList(Model.Meetings, nameof(Meeting.Id), nameof(Meeting.Title)),
new {@id="itemList"})
或者,Razor
<select>
标签助手与来自 MVC 的 HTML 助手相比,有助于提高可读性。
<select id="itemList"
asp-items="@new SelectList(Model.Meetings, nameof(Meeting.Id), nameof(Meeting.Title))"
aria-label="List of meetings"></select>