填充视图模型 / 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 有效,但可用角色列表无效。
现在我可以想到这个问题的多种解决方案,但不确定如何进行:
- 我可以为 UserEditViewModel 创建自定义构造函数,它从数据库填充 AvailableRoles 列表。但这意味着我需要将对数据库上下文的引用传递到 UserEditViewModel
- 我可以简单地忽略 ModelState 因为我知道它是无效的?在这种情况下我会失去什么?
我曾希望 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");
。
我不太了解模型验证。让我们假设以下 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 有效,但可用角色列表无效。
现在我可以想到这个问题的多种解决方案,但不确定如何进行:
- 我可以为 UserEditViewModel 创建自定义构造函数,它从数据库填充 AvailableRoles 列表。但这意味着我需要将对数据库上下文的引用传递到 UserEditViewModel
- 我可以简单地忽略 ModelState 因为我知道它是无效的?在这种情况下我会失去什么?
我曾希望 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");
。