4

想象一个razor pageForm很多用户填写的输入。

post当它想要像这样验证发布的模型时使用方法:

public IActionResult OnPost()
{
     if (!ModelState.IsValid)
     {
        return Page(model);
     }
}

例如,如果该模型的 3 个属性(名称:a、b、c)无效,它会返回剃刀视图并显示错误(因为asp-validation-for每个属性),如下所示:

The a field is required.
The b field is not a valid e-mail address.
The c field is required.

我想为所有人显示一个特定的错误,如下所示:

This Input is not valid.
This Input is not valid.
This Input is not valid.

我知道我可以(ErrorMessage ="")分别为它们中的每一个使用,但它在大尺寸上是不合逻辑的!有没有办法为所有无效的人显示特定的按摩ModelStates

编辑:

例如,在 View 中显示错误之前,将其错误消息更改如下:

@foreach (var error in modelStateErrors)
{
    error.text = "Fill it";
}

在此处输入图像描述

4

4 回答 4

5

我使用 ModelState 的扩展方法创建了一个解决方案。
它基本上从状态中删除任何错误,并将它们与所需的消息一起添加回来。

在您的命名空间中创建一个ModelStateExtensions.cs

public static class ModelStateExtensions
{
    public static void SetAllErrorMessages(this ModelStateDictionary modelState, string errorMessage)
    {
        foreach (var state in modelState)
        {
            if (state.Value.Errors.Count > 0)
            {
                modelState.Remove(state.Key);
                modelState.AddModelError(state.Key, errorMessage);
            }
        }
    }
}

然后,如果您的 ModelState 无效,您可以在返回页面之前转换消息:

public IActionResult OnPost()
{
     if (!ModelState.IsValid)
     {
        ModelState.SetAllErrorMessages("Your message here");
        return Page(model);
     }
}
于 2020-11-09T14:39:14.693 回答
2

如果您不想更改每个 Razor 页面,可以使用页面过滤器自动清除和重命名错误消息。

这是一个示例页面过滤器:

public class ModelStatePageFilter : IPageFilter
{
    public void OnPageHandlerExecuted(PageHandlerExecutedContext ctx) { }

    public void OnPageHandlerExecuting(PageHandlerExecutingContext ctx)
    {
        foreach (var (k, v) in ctx.ModelState
            .Where(x => x.Value.ValidationState == ModelValidationState.Invalid))
        {
            v.Errors.Clear();
            v.Errors.Add("This Input is not valid.");
        }
    }

    public void OnPageHandlerSelected(PageHandlerSelectedContext ctx) { }
}

您需要在 中注册此页面过滤器Startup.ConfigureServices。这是一个如何做到这一点的例子:

services.AddRazorPages()
    .AddMvcOptions(o => o.Filters.Add(new ModelStatePageFilter()));
于 2020-11-09T17:54:28.347 回答
2

我知道我可以分别对它们中的每一个使用 ErrorMessage,但这不合逻辑!是否有任何简短的方法可以为所有无效的 ModelStates 显示特定的按摩?

对于这个问题,我认为显示错误消息最简单的方法是使用 ErrorMessage,如果要将它们一起显示,可以使用 asp-validation-summary 属性,如下所示:

<div asp-validation-summary="All" class="text-danger"></div>

在此处输入图像描述

如果您不想使用上述方法,您也可以从 ModelState 字典中获取无效字段,然后重新生成错误消息。像这样的代码:

    public IActionResult OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            //get the new error message, you could also get all inValid fields.
            var messages = ModelState.Keys
                    .SelectMany(key => ModelState[key].Errors.Select(x => string.Format("The {0} is invalid", key)))
                    .ToList();
            ViewData["message"] = messages; //transfer the error message to the view

            return Page();
        }
         return  RedirectToPage("./Index");
      }

查看代码(显示错误信息(不使用asp-validation-forand asp-validation-summary)):

        <div class="form-group">
            @if (ViewData["message"] != null)
            {
                foreach (var item in (List<string>)ViewData["message"])
                { 
                    <span class="text-danger">@item</span><br/>
                }
            }
            <div id="debug">

            </div>
        </div>

输出如下:

在此处输入图像描述

【注意】以上方法为服务端验证。如果要使用客户端验证实现相同的行为,则必须使用 JavaScript 获取客户端验证结果,然后生成新的错误消息。

所以,在我看来,我建议您可以尝试使用第一种方法(使用错误消息和asp-validation-summary)来显示错误消息,并通过对每个属性分隔符使用错误消息,用户可以更容易理解验证规则。

于 2020-10-12T15:48:50.910 回答
0

您可以使用验证摘要(请参阅:https ://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.1#the-validation-tag-helpers )。

@model RegisterViewModel

<form asp-controller="Demo" asp-action="RegisterValidation" method="post">
    <div asp-validation-summary="ModelOnly"></div>
    Email:  <input asp-for="Email" /> <br />
    <span asp-validation-for="Email"></span><br />
    Password: <input asp-for="Password" /><br />
    <span asp-validation-for="Password"></span><br />
    <button type="submit">Register</button>
</form>

如果要更改显示的错误消息,可以在 ViewModel 中进行:

[Required(ErrorMessage = "This Input is invalid")]
public string Email { get; set; }

[Required(ErrorMessage = "This Input is invalid")]
public string Password{ get; set; }
于 2020-10-12T11:53:47.710 回答