【问题标题】:Why is this view-model string field treated as required?为什么这个视图模型字符串字段被视为必需?
【发布时间】:2021-04-29 15:17:28
【问题描述】:

我有一个简单的登录页面,其视图模型如下。它过去工作得很好,但似乎突然之间,ModelState 将包含 ReturnUrl 字段的错误,如果它没有提供给操作。它指出,“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 字段(即可为空)执行此操作?

这是使用该模型的控制器操作的开始。

[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."

我可以补充的一个细节是,我在另一个项目中具有相同的模型和动作,并且在该项目中,它运行良好。如果我在该项目中调试登录操作,我会看到 ModelState.Results 仅包含 2 个元素:“用户名”和“密码”。第三个元素(“ReturnUrl”)不存在,这是我所期望的,因为它不应该得到验证。

【问题讨论】:

  • 嗨@MarredCheese,请分享更多代码。您是否自定义验证?只分享模型没有帮助。
  • @Rena 我添加了动作和调试信息。不,没有什么习俗。
  • 是 MVC + EF Core 吗?
  • 它是 .NET Core 3.1,MVC,没有 EF(使用 Dapper 代替)。
  • 我猜你最近做了一个启用可空引用类型的更改,而 ASP.NET 决定因为该值不可为空,所以它是必需的。

标签: c# asp.net-core-mvc asp.net-core-3.1 nullable-reference-types


【解决方案1】:

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

<Nullable>annotations</Nullable>

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

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

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

【讨论】:

  • 启用它并明确说明它实际上非常好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多