Asp.net core 将选择列表绑定到ASP.NET核心中的复杂对象

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

使用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.")]
    [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);
测试结果


此外,另一种可能的方法是创建一个渲染
元素,并根据实际模型数据和要求设置所选值。

是否能够以某种方式绑定下拉列表?是否能够以某种方式绑定下拉列表?