我的管理员型号:
[Required]
public int AdminId { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string Name {get; set;}
我需要用户登录(不注册,因此我不需要名称属性): 所以,有2个属性:
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.AdminId)
@Html.EditorFor(model => model.Password)
这是行动:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "AdminId, Password", Exclude = "Name")]Admin admin)
{
if (ModelState.IsValid)
{
//
}
}
但 ModelState.IsValid 始终返回false,告诉我名称属性不存在。 我知道我使用 [必需] ,但它仅用于注册,而不是用于登录,我甚至在登录时都不添加Name属性。为什么还要回假?我该如何解决?
更新1
我只是添加另一个新属性:
[Required]
public int WorkPlace { get; set; }
但它不是由ModelState.IsValid有效......但为什么名字需要?因为字符串类型?
更新2
看起来这是一种某种BUG。因为int类型可以删除 使用排除。但字符串类型不能......
答案 0 :(得分:1)
您的admin
对象只是一个参数。但是您的Admin
视图模型需要Name属性。因此,当缺少Name
属性时,模型状态正确无效。
两个快速的解决方案是:
我选择2
更新
实际上我不知道这个存在,但你可以按照this answer使用ModelState.Remove
答案 1 :(得分:1)
它不是一个错误。使用Bind.Exclude
只是意味着即使回发属性值,也不要在我的模型中设置它的值。它用于防止过度发布攻击as explained in more detail here。 int
类型适用于您的情况,因为int
的默认值为0
,因此其有效,但对于string
,默认值为null
,因此{{1}失败了。处理此问题的最佳方法是创建仅包含要编辑的属性的视图模型
[Required]
然后回发该模型(不需要public class LogInVM
{
[Required]
public int AdminId { get; set; }
[Required]
public string Password { get; set; }
}
属性)
Bind