Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# .NET核心:始终显示验证错误_C#_Asp.net Core Mvc - Fatal编程技术网

C# .NET核心:始终显示验证错误

C# .NET核心:始终显示验证错误,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我有简单的登录表单。 除了一件事,一切都很好。当您进入该页面时,它始终显示验证(例如,字段是必需的),即使没有数据发布到控制器。 是否只有在实际发出POST请求时才能显示验证 查看: @model LoginViewModel <form asp-controller="User" asp-action="Login" method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"&g

我有简单的登录表单。
除了一件事,一切都很好。当您进入该页面时,它始终显示验证(例如,字段是必需的),即使没有数据发布到控制器。
是否只有在实际发出POST请求时才能显示验证

查看

@model LoginViewModel
<form asp-controller="User" asp-action="Login" method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

    <label asp-for="Email"></label>
    <input asp-for="Email" />
    <span asp-validation-for="Email"></span>

    <label asp-for="Password"></label>
    <input asp-for="Password" />
    <span asp-validation-for="Password"></span>

    <button type="submit">Login</button>
</form>
public class LoginViewModel
{
    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}
[HttpGet]
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model)
    {
        ClaimsPrincipal userClaims = _userRepository.TryLogin(model);

        if (userClaims != null)
        {
            ...
        }
        return View(model);
    }
行动

@model LoginViewModel
<form asp-controller="User" asp-action="Login" method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

    <label asp-for="Email"></label>
    <input asp-for="Email" />
    <span asp-validation-for="Email"></span>

    <label asp-for="Password"></label>
    <input asp-for="Password" />
    <span asp-validation-for="Password"></span>

    <button type="submit">Login</button>
</form>
public class LoginViewModel
{
    [Required]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}
[HttpGet]
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model)
    {
        ClaimsPrincipal userClaims = _userRepository.TryLogin(model);

        if (userClaims != null)
        {
            ...
        }
        return View(model);
    }
[HttpGet]
[HttpPost]
[异名]
公共异步任务登录(LoginViewModel模型)
{
ClaimsPrincipal userClaims=\u userRepository.TryLogin(模型);
if(userClaims!=null)
{
...
}
返回视图(模型);
}

正如Paul在评论中提到的那样,您应该删除
[Get]
属性,该属性将阻止对操作的Get请求,而是创建一个新的控制器操作,负责处理Get请求,该操作的模型
LoginViewModel
不会为空

例如:

[AllowAnonymous]
public async Task<IActionResult> Login()
{
    return View(new LoginViewModel());
}

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(LoginViewModel model)
{
    ClaimsPrincipal userClaims = _userRepository.TryLogin(model);

    if (userClaims != null)
    {
        ...
    }
    return View(model);
}
[AllowAnonymous]
公共异步任务登录()
{
返回视图(新的LoginViewModel());
}
[HttpPost]
[异名]
公共异步任务登录(LoginViewModel模型)
{
ClaimsPrincipal userClaims=\u userRepository.TryLogin(模型);
if(userClaims!=null)
{
...
}
返回视图(模型);
}

现在,您的验证只会因无效的post模型而触发。

。。。。尝试从登录功能中取出
[HttpGet]
。谢谢!这就成功了。我想把它保持在一个动作中,但这种方法至少有效:)很高兴它起了作用。将命令与查询(post和get)分离通常可以使事情更易于维护。更不用说让一种方法同时处理post和get将违反单一责任原则。