Asp.net core 将选择列表绑定到ASP.NET核心中的复杂对象
使用ASP.NET Core Razor Pages,是否可以将选择列表绑定到复杂对象,而不必在PageModel中具有ID属性 我有以下模型课程:Asp.net core 将选择列表绑定到ASP.NET核心中的复杂对象,asp.net-core,model-binding,razor-pages,Asp.net Core,Model Binding,Razor Pages,使用ASP.NET Core Razor Pages,是否可以将选择列表绑定到复杂对象,而不必在PageModel中具有ID属性 我有以下模型课程: public class Department { [HiddenInput] public int ID { get; set; } [Display(Name = "Name")] [Required(ErrorMessage = "{0} must be specified.")] [StringLe
public class Department
{
[HiddenInput]
public int ID { get; set; }
[Display(Name = "Name")]
[Required(ErrorMessage = "{0} must be specified.")]
[StringLength(50, MinimumLength = 1, ErrorMessage = "{0} has to be {2} to {1} characters long.")]
public string Name { get; set; }
}
public class User
{
[HiddenInput]
public int ID { get; set; }
[Display(Name = "Name")]
[Required(ErrorMessage = "{0} must be specified.")]
[StringLength(50, MinimumLength = 1, ErrorMessage = "{0} has to be {2} to {1} characters long.")]
public string Name { get; set; }
[Display(Name = "Department")]
[Required(ErrorMessage = "{0} must be specified.")]
public Department Department { get; set; }
}
我已经创建了一个用于编辑用户的视图,包括选择部门。这是我的页面模型:
public class EditModel : PageModel
{
private readonly IUserRepository _userRepository;
[BindProperty(BinderType = typeof(UserModelBinder))]
public User UserToEdit { get; set; }
public SelectList DepartmentsSL { get; set; }
public EditModel(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void OnGet(int id)
{
UserToEdit = _userRepository.GetUser(id);
PopulateSelectList();
}
public IActionResult OnPost()
{
if (!ModelState.IsValid)
{
PopulateSelectList();
return Page();
}
var success = _userRepository.UpdateUser(UserToEdit);
if (success)
{
return RedirectToPage("./Index");
}
else
{
throw new Exception("Could not save the user.");
}
}
private void PopulateSelectList()
{
var departments = _userRepository.GetAllDepartments();
DepartmentsSL = new SelectList(departments, nameof(Department.ID), nameof(Department.Name), UserToEdit.Department.ID);
}
}
…这是我的观点:
@page
@model ProjectName.Pages.Admin.Users.EditModel
@{
ViewData["Title"] = "Edit user";
}
<h1>Edit user</h1>
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input asp-for="UserToEdit.ID" />
<div class="form-group">
<label asp-for="UserToEdit.Name" class="control-label"></label>
<input asp-for="UserToEdit.Name" class="form-control" />
<span asp-validation-for="UserToEdit.Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="UserToEdit.Department" class="control-label"></label>
<select asp-for="UserToEdit.Department" class="form-control" asp-items="@Model.DepartmentsSL">
<option value="">Choose department</option>
</select>
<span asp-validation-for="UserToEdit.Department" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
<a asp-page="./Index" class="btn btn-secondary">Cancel</a>
</div>
</form>
现在,所有这一切似乎都很好——我可以更改名称和部门,并正确地发回。验证也有效。但是,打开此编辑视图时,在选择列表中未选择用户的当前部门
在EditModel.PopulateSelectList()中,我尝试了不同的方法,但似乎都不管用
DepartmentsSL = new SelectList(departments, nameof(Department.ID), nameof(Department.Name), UserToEdit.Department);
DepartmentsSL = new SelectList(departments, nameof(Department.ID), nameof(Department.Name), UserToEdit.Department.ID);
DepartmentsSL = new SelectList(departments, nameof(Department.ID), nameof(Department.Name), UserToEdit.Department.Name);
最后一部分有可能解决吗
到目前为止,我看到的解决方案是在PageModel中有一个单独的属性“DepartmentID”,并绑定到该属性,然后在回发后设置User的Department属性。我想这也意味着我可以摆脱自定义模型绑定器,但我真的很想看看我当前的解决方案是否可以一直采用。:)
打开此编辑视图时,不会在选择列表中选择用户的当前部门
您可以尝试从SelectTagHelper中删除asp for=“UserToEdit.Department”
,然后手动设置name=“UserToEdit.Department”
,如下所示
<select name="UserToEdit.Department" class="form-control" asp-items="@Model.DepartmentsSL">
<option value="">Choose department</option>
</select>
DepartmentsSL = new SelectList(departments, nameof(Department.ID), nameof(Department.Name), UserToEdit.Department.ID);
测试结果
此外,另一种可能的方法是创建渲染
元素并根据实际模型数据和需求设置选定值
打开此编辑视图时,不会在选择列表中选择用户的当前部门
您可以尝试从SelectTagHelper中删除asp for=“UserToEdit.Department”
,然后手动设置name=“UserToEdit.Department”
,如下所示
<select name="UserToEdit.Department" class="form-control" asp-items="@Model.DepartmentsSL">
<option value="">Choose department</option>
</select>
DepartmentsSL = new SelectList(departments, nameof(Department.ID), nameof(Department.Name), UserToEdit.Department.ID);
测试结果
此外,另一种可能的方法是创建一个渲染
元素,并根据实际模型数据和要求设置所选值。是否能够以某种方式绑定下拉列表?是否能够以某种方式绑定下拉列表?