Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC5提交表单时为什么包含not exists属性?_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

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
属性丢失时,模型状态正确无效

两个快速解决方案是:

  • 删除所需的属性
  • 为登录创建新的ViewModel
  • 我会选择
    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)
    {
      ....