- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于验证摘要,您通常有这样的内容:
<div asp-validation-summary="ModelOnly" class="..."></div>
其中,如果出现空字符串错误,因为字段/属性将显示在 <ul>
内的那个 div 内。列表。
如果我想使用 div
的序列来显示它们怎么办?具有特定的 class
属性?或者任何其他自定义格式?
对于现场验证,您通常会这样做:
<div class="form-group">
<label asp-for="OldPassword"></label>
<input asp-for="OldPassword" class="form-control" />
<span asp-validation-for="OldPassword" class="text-danger"></span>
</div>
并且错误被作为文本插入到 span
中元素。
我使用的模板需要 has-errors
应用于 form-group
的类div
元素,以防出现错误,因为它需要同时设置标签和输入的样式。
它还需要 span
成为div
(出于某些未知原因)并且令人惊讶地改变了 span
至 div
防止 div 插入错误文本;更不用说包装 span
在 div
里面产生的问题是 div
应用了适当的间距,因此即使没有错误,div 也会显示令人讨厌的空格。
使用如上所示的自定义规则处理自定义表单验证格式(尝试 DRY,因为我的应用程序有很多表单)的最惯用的方法是什么?
最佳答案
这里有一些扩展点,您可以考虑为验证摘要和字段验证错误提供自定义呈现:
IHtmlGenerator
)Tag Helpers
) asp-validation-summary
和 asp-validation-for
标签助手使用 GenerateValidationSummary
和 GenerateValidationMessage
IHtmlGenerator
的注册实现方法服务 DefaultHtmlGenerator
默认情况下。
您可以提供派生 DefaultHtmlGenerator
的自定义实现并覆盖这些方法,然后在启动时注册服务。这样,这些标签助手将使用您的自定义实现。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddTransient<IHtmlGenerator, MyHtmlGenerator>();
}
这是 source code of DefaultHtmlGenerator
的链接帮助您自定义实现。
示例 - 创建新的实现 IHtmlGenerator
这只是一个简单的示例,用于显示所需的命名空间和方法,以及可以进入您的自定义实现的内容。提供自定义实现后,不要忘记在 ConfigureServices
中注册它就像我上面所做的那样。
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
using Microsoft.Extensions.Options;
using System.Text.Encodings.Web;
namespace ValidationSampleWebApplication
{
public class MyHtmlGenerator : DefaultHtmlGenerator
{
public MyHtmlGenerator(IAntiforgery antiforgery, IOptions<MvcViewOptions> optionsAccessor, IModelMetadataProvider metadataProvider, IUrlHelperFactory urlHelperFactory, HtmlEncoder htmlEncoder, ValidationHtmlAttributeProvider validationAttributeProvider)
: base(antiforgery, optionsAccessor, metadataProvider, urlHelperFactory, htmlEncoder, validationAttributeProvider)
{
}
public override TagBuilder GenerateValidationMessage(ViewContext viewContext, ModelExplorer modelExplorer, string expression, string message, string tag, object htmlAttributes)
{
return base.GenerateValidationMessage(viewContext, modelExplorer, expression, message, tag, htmlAttributes);
}
public override TagBuilder GenerateValidationSummary(ViewContext viewContext, bool excludePropertyErrors, string message, string headerTag, object htmlAttributes)
{
return base.GenerateValidationSummary(viewContext, excludePropertyErrors, message, headerTag, htmlAttributes);
}
}
}
您也可以 author your custom tag helpers .为此,从 TagHelper
派生就足够了并覆盖 Process
方法。
然后您可以简单地在 View 中或在_ViewImports.cshtml
中全局注册创建的标签助手。 :
@using ValidationSampleWebApplication
@using ValidationSampleWebApplication.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, ValidationSampleWebApplication
此外,在创建用于验证的自定义标签助手时,您可以考虑:
示例 - 将 hasError 类添加到表单组 div
在这个例子中,我创建了一个 asp-myvalidation-for
可应用于 div
这样的元素<div class="form-group" asp-myvalidation-for="LastName">
并将添加 hasError
类别为 div
如果指定字段有验证错误。不要忘记在_ViewImports.cshtml
中注册它就像我上面所做的那样。
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace ValidationSampleWebApplication
{
[HtmlTargetElement("div", Attributes = MyValidationForAttributeName)]
public class MyValidationTagHelper : TagHelper
{
private const string MyValidationForAttributeName = "asp-myvalidation-for";
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
[HtmlAttributeName(MyValidationForAttributeName)]
public ModelExpression For { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
base.Process(context, output);
ModelStateEntry entry;
ViewContext.ViewData.ModelState.TryGetValue(For.Name, out entry);
if (entry != null && entry.Errors.Count > 0)
{
var builder = new TagBuilder("div");
builder.AddCssClass("hasError");
output.MergeAttributes(builder);
}
}
}
}
示例 - 添加 field-validation-error
类到表单组 div
在下面的示例中,我添加了 div
支持标准asp-validation-for
标签助手。现有的标签助手只支持 div 元素。我在这里添加了 div
支持asp-validation-for
标签助手,如果出现错误,它将添加 field-validation-error
否则,在有效情况下 div
会有field-validation-valid
类。
标签的默认行为是,如果标签有内容,它不会对标签的内容进行任何更改。因此,将标签助手添加到一个空的 span
将向 span 添加验证错误,但对于具有某些内容的 div,它只是更改 div 的类。不要忘记在_ViewImports.cshtml
中注册它就像我上面所做的那样。
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.AspNetCore.Mvc.TagHelpers;
namespace ValidationSampleWebApplication
{
[HtmlTargetElement("div", Attributes = ValidationForAttributeName)]
public class MytValidationMessageTagHelper : ValidationMessageTagHelper
{
private const string ValidationForAttributeName = "asp-validation-for";
public MytValidationMessageTagHelper(IHtmlGenerator generator) : base(generator)
{
}
}
}
关于c# - 验证摘要和错误的自定义格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46800600/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!