C# MVC5提交表单时为什么包含not exists属性?
这是我的管理员型号:C# MVC5提交表单时为什么包含not exists属性?,c#,asp.net,.net,asp.net-mvc,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;} 我需要用户登录(不注册,所以我不需要名称属性): 因此,有两个属性: @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @cla
[Required]
public int AdminId { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string Name {get; set;}
我需要用户登录(不注册,所以我不需要名称属性):
因此,有两个属性:
@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属性不存在。
我知道我使用了[必选],但它只用于注册,不用于登录,登录时我甚至没有添加Name属性。为什么还归假?我怎样才能修好它
更新1
我只需添加一个另一个新属性:
[Required]
public int WorkPlace { get; set; }
但是它不是由ModelState有效的。是有效的……但是为什么名称需要??因为字符串类型
更新2
看起来像是某种虫子。因为int类型可以删除
使用排除。但是字符串类型不能
您的
admin
对象只是一个参数。但是您的Admin
视图模型需要一个Name属性。因此,当Name
属性丢失时,模型状态正确无效
两个快速解决方案是:
2
更新
实际上我不知道这个存在,但是你可以使用ModelState.Remove-as-by这不是一个bug。使用
Bind.Exclude
仅仅意味着即使属性值被发回,也不要在我的模型中设置它的值。它用于防止过度发布攻击int
类型在您的情况下工作,因为int
的默认值是0
所以它是有效的,但是对于字符串默认值是null
所以[必需]
失败。处理此问题的最佳方法是创建仅包含要编辑的特性的视图模型
public class LogInVM
{
[Required]
public int AdminId { get; set; }
[Required]
public string Password { get; set; }
}
然后发回该模型(不需要任何Bind
属性)
我首先使用EF6数据库生成模型。因此,让我创建一个新的,我想我不能为我的每一个模型这样做。这无法解决问题….ModelState.Remove
工作正常。但为什么一定要用它呢?那对我来说太可怕了。为什么[Bind(Exclude=“Name”)]
不适用于此案例?不,我仍然认为这是一个设计缺陷。如果允许int
,则必须同时允许string
,否则不允许全部。这个设计很糟糕。我正在使用EF6生成模型。我不能为每一个这样的动作创建新的模型……不,这不是一个bug。int
的默认值是0
,因此您应该为WorkPlace
(比如5
)发回一个值,但使用了Bind(Exclude=“WorkPlace”)],然后忽略该值,使其保留为默认值(即0)。它仍然有一个值,因此它完成了
[必需]`验证。另一方面,字符串是引用类型,其默认值为null,这不满足[必需]
验证,因此ModelState
无效。如果将WorkPlace
更改为int?
(可为空),则该操作也将失败。
public ActionResult Index(LogInVM model)
{
....