MVC5为什么在提交表单时包含不存在属性?

时间:2014-10-13 17:14:16

标签: c# asp.net .net asp.net-mvc

我的管理员型号:

[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类型可以删除   使用排除。但字符串类型不能......

2 个答案:

答案 0 :(得分:1)

您的admin对象只是一个参数。但是您的Admin视图模型需要Name属性。因此,当缺少Name属性时,模型状态正确无效。

两个快速的解决方案是:

  1. 删除必需属性
  2. 为登录创建新的ViewModel
  3. 我选择2

    更新

    实际上我不知道这个存在,但你可以按照this answer使用ModelState.Remove

答案 1 :(得分:1)

它不是一个错误。使用Bind.Exclude只是意味着即使回发属性值,也不要在我的模型中设置它的值。它用于防止过度发布攻击as explained in more detail hereint类型适用于您的情况,因为int的默认值为0,因此其有效,但对于string,默认值为null,因此{{1}失败了。处理此问题的最佳方法是创建仅包含要编辑的属性的视图模型

[Required]

然后回发该模型(不需要public class LogInVM { [Required] public int AdminId { get; set; } [Required] public string Password { get; set; } } 属性)

Bind