为什么这个视图模型字符串字段被视为必需的?
Why is this view-model string field treated as required?
我有一个带有下面视图模型的简单登录页面。它曾经工作得很好,但似乎突然间,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”)不存在,这是我所期望的,因为它不应该被验证。
显然,项目的引用类型已设置为不可为空。我不知道它是怎么发生的,但在 <Project>.csproj
中,有这个条目:
<Nullable>annotations</Nullable>
以下是有关该字段的 4 个选项的更多信息:
https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references
如果您删除该条目,您将获得默认值:disable
。请注意,这些可空性上下文也可以通过 #nullable <context>
在文件或行级别进行控制。以上 link 也涵盖了这一点。
如果非要我猜的话,我会说我一定是在查看 Visual Studio 的项目属性图形界面时误按了:
在最新版本的 .NET 中,您必须将字符串声明为可为空(字符串?)或更改项目构建属性以接受字符串为可为空。
我有一个带有下面视图模型的简单登录页面。它曾经工作得很好,但似乎突然间,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”)不存在,这是我所期望的,因为它不应该被验证。
显然,项目的引用类型已设置为不可为空。我不知道它是怎么发生的,但在 <Project>.csproj
中,有这个条目:
<Nullable>annotations</Nullable>
以下是有关该字段的 4 个选项的更多信息:
https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references
如果您删除该条目,您将获得默认值:disable
。请注意,这些可空性上下文也可以通过 #nullable <context>
在文件或行级别进行控制。以上 link 也涵盖了这一点。
如果非要我猜的话,我会说我一定是在查看 Visual Studio 的项目属性图形界面时误按了:
在最新版本的 .NET 中,您必须将字符串声明为可为空(字符串?)或更改项目构建属性以接受字符串为可为空。