【问题标题】:.Net Core display model validation with validation filter.Net Core 显示模型验证与验证过滤器
【发布时间】:2021-01-06 22:37:49
【问题描述】:

我创建了一个基本的 .Net Core Mvc 应用程序,我想为我的所有操作自动设置 ModelState.IsValid 是验证过滤器的代码

public class ValidationFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        if (!context.ModelState.IsValid)
        {
        }

        await next();
    }
}

这是我的操作代码

[HttpPost]
    public IActionResult AddUser(LoginRequestViewModel loginRequestViewModel)
    {
        return View(loginRequestViewModel);
    }

我应该返回什么来显示 asp-validation-for 中的错误? 不使用任何 javascript 代码..

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-core .net-core unobtrusive-validation


    【解决方案1】:

    根据你的代码测试,可以实现全局过滤。需要将 ValidationFilter 设为 startup.cs 中的全局过滤器。

    services.AddControllersWithViews(option=>
                {
                    option.Filters.Add(new ValidationFilter());
                });
    

    然后,创建一个模型。

     public class LoginRequestViewModel
        {
            [MinLength(3)]
            public string username { get; set; }
            public string email { get; set; }
    }
    

    在 ValidationFilter 中定义错误消息。

    public class ValidationFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            if (!context.ModelState.IsValid)
            {
                //Customize your error message
                string messages = string.Join("; ",context.ModelState.Values
                         .SelectMany(x => x.Errors)
                         .Select(x => !string.IsNullOrWhiteSpace(x.ErrorMessage) ? x.ErrorMessage : x.Exception.Message.ToString()));
                context.RouteData.Values.Add("mes", messages);
            }
            
            await next();
        }
    }
    

    在行动中,获取 RouteData。

    [HttpPost]
            public IActionResult AddUser(LoginRequestViewModel loginRequestViewModel)
            {
                ViewData["error"]= RouteData.Values["mes"];
                return View(loginRequestViewModel);
            }
    

    创建 AddUser.cshtml 并使用表单。

     @model solution921.Controllers.LoginRequestViewModel
    <form action="/home/AddUser" method="post">
    @ViewData["error"]
        <input type="text" name="username" value="" />
        <span asp-validation-for="username"></span>
        <input type="text" name="email" value="" />
        <input type="submit" name="" value="sub" />
    </form>
    

    它可以返回正确的验证。

    【讨论】:

    • 正确。但是如果我想在 ValidationFilter 中返回自定义结果,我尝试返回自定义结果但无法显示错误,它会将我发送到 json 格式的页面。我想将该 JsonResult 中的错误显示到我的 Span 或 Div。
    • 我已经更新了我的答案,您可以通过routedata将错误消息从过滤器传递到操作,并使用viewdata将错误消息从操作传递到视图。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多