正如我已经在注释中所写的,select标记助手将使用
asp-for
元素绑定到视图模型。这意味着指定属性中的模型值将用于匹配标记辅助对象的可用项的值,以确定当前选择了哪些项。不管发生什么,这个过程都是有效的
SelectListItem
有它的
Selected
属性设置为
true
.
也就是说,如果你不使用
,那么你完全可以随心所欲地完成这项工作:
// in the controller action
return View(new TaskEditViewModel
{
ProjectId = new List<SelectListItem>()
{
new SelectListItem { Text = "Item 1", Value = "value-1" },
new SelectListItem { Text = "Item 2", Value = "value-2", Selected = false },
new SelectListItem { Text = "Item 3", Value = "value-3" },
new SelectListItem { Text = "Item 4", Value = "value-4" },
},
});
// in the view
<select class="form-control" asp-items="Model.ProjectId"></select>
<select class="form-control">
<option value="value-1">Item 1</option>
<option value="value-2">Item 2</option>
<option selected="selected" value="value-3">Item 3</option>
<option value="value-4">Item 4</option>
</select>
只有当你加上
这会停止工作。
<select class="form-control" id="ProjectId" multiple="multiple" name="ProjectId">
<option value="value-1">Item 1</option>
<option value="value-2">Item 2</option>
<option value="value-3">Item 3</option>
<option value="value-4">Item 4</option>
</select>
倍数
选择。此外,逻辑现在将尝试匹配
SelectListItem.Value
价值
Model.ProjectId
仅用于确定是否选择了某个对象。
正如在注释中所指出的,这不是您通常在这里使用selecttaghelper的方式。相反,您将为所选的
价值
public class TaskEditViewModel
{
// â¦
public string ProjectId { get; set; }
public IEnumerable<SelectListItem> AvailableProjects { get; set; }
}
// in the controller
return View(new TaskEditViewModel
{
ProjectId = "value-3",
AvailableProjects = new List<SelectListItem>()
{
new SelectListItem { Text = "Item 1", Value = "value-1" },
new SelectListItem { Text = "Item 2", Value = "value-2" },
new SelectListItem { Text = "Item 3", Value = "value-3" },
new SelectListItem { Text = "Item 4", Value = "value-4" },
},
});
// in the view
<select asp-for="ProjectId" class="form-control" asp-items="Model.AvailableProjects"></select>
现在,这是您将获得的HTML:
<select class="form-control" id="ProjectId" name="ProjectId">
<option value="value-1">Item 1</option>
<option value="value-2">Item 2</option>
<option selected="selected" value="value-3">Item 3</option>
<option value="value-4">Item 4</option>
</select>
请注意,项3现在已隐式选中,即使其
选择列表项
没有
挑选出来的
ProjectId
在模型中恰好等于
Value
的
选择列表项
. 这正是它使用的逻辑。
这种方法比使用
中的属性
选择列表项
option
name
的
select
标记是值所用于的键,提交表单将有效地发送
ProjectId=value-3
当该模型作为控制器中POST操作的一部分绑定时,该值可以正确地反序列化到
模型的属性:
[HttpPost]
public IActionResult Edit(TaskEditViewModel model)
{
var selectedProject = model.ProjectId; // "value-3"
// â¦
}