繁体   English   中英

为什么这个视图模型字符串字段被视为必需的?

[英]Why is this view-model string field treated as required?

我有一个简单的登录页面,下面是视图 model。 它曾经工作得很好,但似乎突然间,如果未将ReturnUrl字段提供给操作, ModelState将包含一个错误。 它指出,“ReturnUrl 字段是必需的。”

public class LoginViewModel
{
    [Required(ErrorMessage = TextValidation.RequiredErrorMessage)]
    [Display(Name = "User")]
    public string Username { get; set; }

    [Required(ErrorMessage = TextValidation.RequiredErrorMessage)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    public string ReturnUrl { get; set; }
}

为什么它会对没有[Required]注释的string字段(即可为空)执行此操作?

这是使用 model 的 controller 操作的开头。

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View();  // <-- It returns here.
    }
    ...
}

如果我调试,我会看到以下内容:

ModelState.Results[2].Key = "ReturnUrl"
ModelState.Results[2].Value.AttemptedValue = null
ModelState.Results[2].Value.Errors[0].ErrorMessage = "The ReturnUrl field is required."

我可以添加的更多细节是我在另一个项目中有相同的 model 和操作,并且在那个项目中,它工作正常。 如果我调试该项目中的登录操作,我会看到ModelState.Results仅包含 2 个元素:“用户名”和“密码”。 第三个元素(“ReturnUrl”)不存在,这是我所期望的,因为它不应该得到验证。

显然,该项目的引用类型已设置为不可为空。 我不知道它是怎么发生的,但是在<Project>.csproj中,有这个条目:

<Nullable>annotations</Nullable>

以下是有关该字段的 4 个选项的更多信息:
https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references

如果您删除该条目,您将获得默认值: disable 请注意,这些可空性上下文也可以通过#nullable <context>在文件或行级别进行控制。 上面的链接也涵盖了这一点。

如果我不得不猜测,我会说我在查看项目属性的 Visual Studio 图形界面时一定是点击了错误:

特性

在 .NET 的最新版本中,您必须将字符串声明为可为空(字符串?)或更改项目构建属性以接受字符串为可为空。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM