填充视图模型 / ModelState.IsValid

Populate View Model / ModelState.IsValid

我不太了解模型验证。让我们假设以下 ViewModel:

public class UserEditViewModel
{
    public List<Role> AvailableRoles { get; set; }
    public string? SelectedRole { get; set; }   
}

目标是让用户 select 从角色列表(想想下拉菜单)中选择。

在 HttpGet 中,我从数据库中填充可用角色列表,如下所示:

UserEditViewModel uevm = new UserEditViewModel();
uevm.AvailableRoles = _db.Roles.ToList();

当我从 HttpPost 事件中得到 UserEditViewModel 时,它将有一个无效的模型状态:

if (ModelState.IsValid) { ...}

验证将声明虽然 SelectedRole 有效,但可用角色列表无效。

现在我可以想到这个问题的多种解决方案,但不确定如何进行:

我曾希望 Bind 属性 可能会像这样提供帮助:

public ActionResult EditUser([Bind(include:"SelectedRole")] UserEditViewModel editViewModel, string id)

但即使我指定我只想要 SelectedRole,ModelState 似乎仍然无效。

这让我想到了最终的问题:解决这个问题的正确方法是什么?

尝试在服务器端应用 [ValidateNever] 属性以删除验证未使用的 属性:

public class UserEditViewModel
{
    [ValidateNever]
    public List<Role> AvailableRoles { get; set; }
    public string? SelectedRole { get; set; }   
}

来自文档:

Indicates that a property or parameter should be excluded from validation. When applied to a property, the validation system excludes that property. When applied to a parameter, the validation system excludes that parameter. When applied to a type, the validation system excludes all properties within that type.

但是,如果只有在从特定视图返回模型数据时才需要避免验证,请在 if (ModelState.IsValid) {...} 之前使用 ModelState.Remove("AvailableRoles");