ASP.NET Core 2.0如何实现Laravel式验证失败重定向回显错误?
ASP.NET Core 2.0实现Laravel式验证错误重定向回显
当然原生支持啦!ASP.NET Core 2.0完全能实现你想要的、类似Laravel那种验证失败后回原页面带错误提示的功能,根本不用局限于返回JSON或者靠JS验证~下面给你两种常见场景的实现方案:
1. 官方推荐:直接返回登录视图(无需显式重定向)
这是最常用的方式,和Laravel的withErrors体验一致,而且更高效。当ModelState验证失败时,直接返回对应的登录视图并传入用户提交的请求对象,ASP.NET Core会自动把验证错误传递到视图中,还能保留用户之前输入的内容。
修改你的控制器代码:
[HttpPost] public IActionResult ProcessLogin(LoginRequest loginRequest) { if (!ModelState.IsValid) { // 如果ProcessLogin和登录视图对应的Action是同一个,直接写return View(loginRequest);就行 return View("Login", loginRequest); } // 登录处理逻辑.... return RedirectToAction("Home"); }
然后在登录视图里,用ASP.NET Core的Tag Helper就能轻松显示错误:
<!-- 显示所有验证错误的汇总 --> <div asp-validation-summary="All" class="text-danger"></div> <!-- 单个字段的错误提示 --> <div class="form-group"> <label asp-for="Email"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div>
2. 特殊场景:必须重定向回原页面
如果你因为业务需求确实需要重定向(比如POST请求来自其他页面),可以用TempData来存储错误信息,重定向后再把错误恢复到ModelState中,模拟Laravel的redirect()->back()->withErrors行为:
第一步:在POST方法中把错误存入TempData
[HttpPost] public IActionResult ProcessLogin(LoginRequest loginRequest) { if (!ModelState.IsValid) { // 把ModelState错误序列化成字典存入TempData TempData["Errors"] = JsonConvert.SerializeObject(ModelState.ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray() )); // 重定向回登录页面 return RedirectToAction("Login"); } // 登录处理逻辑.... return RedirectToAction("Home"); }
注:ASP.NET Core 2.0默认包含Newtonsoft.Json包,直接用就行~
第二步:在目标Action中恢复错误到ModelState
public IActionResult Login() { // 检查TempData里有没有错误信息 if (TempData.ContainsKey("Errors")) { var errors = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(TempData["Errors"].ToString()); foreach (var error in errors) { foreach (var message in error.Value) { ModelState.AddModelError(error.Key, message); } } } return View(); }
这样重定向到登录页面后,视图里的错误提示就能正常显示了。
内容的提问来源于stack exchange,提问作者Jan Wytze
相关产品推荐
相关产品推荐

