2017-01-13 58 views
2

我有簡單的登錄表單。
除了一件事,一切都很好。當您進入該頁面時,即使未向控制器發送任何數據,它也會始終顯示驗證(例如,字段需要)。
有沒有什麼方法可以僅在有實際的POST請求時才顯示驗證?.NET核心:總是顯示驗證錯誤

查看

@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); 
    } 
+0

[這個SO問題應該是有趣的](http://stackoverflow.com/q/20642328/463206).... [和這個SO問題](http://stackoverflow.com/q/7390902/ 463206) – radarbob

+3

嘗試從Login函數中取出'[HttpGet]'。 –

回答

3

正如保羅在註釋中提到的s,則應刪除[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); 
} 

現在,您的驗證只會觸發爲無效後模型的結果。

+0

謝謝!那就是訣竅。我想保持在一個行動,但這種做法至少工程:) –

+0

很高興它幫助。將命令從查詢中分離出來(從發佈後)通常可以使事情更易於維護。更何況一個方法處理後和獲取將違反單一責任原則。 –