> 信息中心 >

asp.net core taghelper无法生成客户端验证属性

来源:互联网 编辑:刘梓楠

有网友碰到过这样的问题:asp.net core taghelper无法生成客户端验证属性,问题详细内容为:

EditorTagHelper.cs (来源:nopCommerce中的nop-editor)

[HtmlTargetElement("editor", Attributes = ForAttributeName, TagStructure = TagStructure.WithoutEndTag)] public class EditorTagHelper : TagHelper { private const string ForAttributeName = "asp-for"; private const string DisabledAttributeName = "asp-disabled"; private const string RequiredAttributeName = "asp-required"; private const string RenderFormControlClassAttributeName = "asp-render-form-control-class"; private const string TemplateAttributeName = "asp-template"; private const string PostfixAttributeName = "asp-postfix"; private readonly IHtmlHelper _htmlHelper; [HtmlAttributeName(ForAttributeName)] public ModelExpression For { get; set; } [HtmlAttributeName(DisabledAttributeName)] public string IsDisabled { set; get; } [HtmlAttributeName(RequiredAttributeName)] public string IsRequired { set; get; } [HtmlAttributeName(RenderFormControlClassAttributeName)] public string RenderFormControlClass { set; get; } [HtmlAttributeName(TemplateAttributeName)] public string Template { set; get; } [HtmlAttributeName(PostfixAttributeName)] public string Postfix { set; get; } [HtmlAttributeNotBound] [ViewContext] public ViewContext ViewContext { get; set; } public EditorTagHelper(IHtmlHelper htmlHelper) { _htmlHelper = htmlHelper; } public override void Process(TagHelperContext context, TagHelperOutput output) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (output == null) { throw new ArgumentNullException(nameof(output)); } output.SuppressOutput(); var htmlAttributes = new Dictionary<string, object>(); bool.TryParse(IsDisabled, out var disabled); if (disabled) { htmlAttributes.Add("disabled", "disabled"); } bool.TryParse(IsRequired, out var required); if (required) { output.PreElement.SetHtmlContent("<div class=\"input-group input-group-required\">"); output.PostElement.SetHtmlContent("<div class=\"input-group-btn\"><span class=\"required\">*</span></div></div>"); } var viewContextAware = _htmlHelper as IViewContextAware; viewContextAware?.Contextualize(ViewContext); bool.TryParse(RenderFormControlClass, out var renderFormControlClass); if (string.IsNullOrEmpty(RenderFormControlClass) && For.Metadata.ModelType.Name.Equals("String") || renderFormControlClass) htmlAttributes.Add("class", "form-control"); if (For.Metadata.AdditionalValues.TryGetValue("PlaceHolderAttribute", out var value)) { if (value is PlaceHolderAttribute placeholder) { var content = placeholder.Content; htmlAttributes.Add("placeholder", content); } } var viewEngine = CommonHelper.GetPrivateFieldValue(_htmlHelper, "_viewEngine") as IViewEngine; var bufferScope = CommonHelper.GetPrivateFieldValue(_htmlHelper, "_bufferScope") as IViewBufferScope; var templateBuilder = new TemplateBuilder( viewEngine, bufferScope, _htmlHelper.ViewContext, _htmlHelper.ViewData, For.ModelExplorer, For.Name, Template, readOnly: false, additionalViewData: new { htmlAttributes, postfix = this.Postfix }); var htmlOutput = templateBuilder.Build(); output.Content.SetHtmlContent(htmlOutput.RenderHtmlContent()); } }

 SampleModel.cs

复制代码 public class SampleModel { [Display(Name = "标题")] [PlaceHolder("请提供标题")] [Required(ErrorMessage = "请输入主题")] [MaxLength(100,ErrorMessage = "太多字了")] public string Name { get; set; } [Display(Name = "标题")] [PlaceHolder("请提供标题")] [Required(ErrorMessage = "请输入主题")] [MaxLength(100, ErrorMessage = "太多字了")] public string Title { get; set; } } 复制代码

cshtml

@model SampleModel <editor asp-for="Name" asp-required="true" /> <editor asp-for="Title" asp-required="true" />

Name可以生成验证属性

Title无法生成验证属性

奇怪了,查了asp.net core源码没找到原因,卡了好几天了

asp.net core taghelper TemplateBuilder ,我搜你通过互联网收集了相关的一些解决方案,希望对有过相同或者相似问题的网友提供帮助,具体如下:

解决方案1:
建议试试将 [Display(Name = "标题")] 中的 Name 改为不同的名称 收获园豆:50
============================================
[Display(Name = "标题")]你是指将Name的值改掉还是什么?
============================================
@远扬: 改掉,比如[Display(Name = "标题2")]
============================================
@dudu: 这个应该不会和DisplayAttribute有关吧? 客户端验证规则应该是ValidationAttribute提供的
============================================
@dudu: 试过了~无效~字段名为Title就无法生成验证属性,醉了....
============================================
@远扬: 删除 <editor asp-for="Name" asp-required="true" /> 试试,是不是不支持多个 <editor>
============================================
@dudu: 是支持的~就是因为单个字段名为Title无效,所以我才多一个Name作为比较的,只要字段名不为 Title 就会添加客户端验证属性,服务端验证是没问题的。
============================================
@远扬: 能提供重现这个问题的示例代码吗?
============================================
@dudu: 我试过在nopCommerce上使用也是无效的,但使用asp.net core内置的InputTagHelper是会生成客户端验证属性的,使用TemplateBuilder创建自定义TagHelper则在字段名为Title就不会生成客户端验证属性,字段名为其他均可以(暂时没试出不可以的),稍等为整理下上传问题代码
============================================
@dudu:这是问题示例代码: https://files.cnblogs.com/files/chen8854/Sample.rar 感觉应该是.net core的bug
============================================
@远扬: 找到原因了,是和 ViewData["Title"] = "Editor Sample"; 中的 Title 名称冲突了
============================================
@dudu: 尴尬了,名称冲突了,除了将ViewData["Title"]中的Title改掉是否还有其他方法处理此问题?
============================================
@远扬: 新建一个 ViewData ,移除 Title ,传给 TemplateBuilder var viewData = new ViewDataDictionary(_htmlHelper.ViewData); viewData.Remove("Title"); var templateBuilder = new TemplateBuilder( viewEngine, bufferScope, _htmlHelper.ViewContext, viewData, For.ModelExplorer, For.Name, Template, readOnly: false, additionalViewData: new { htmlAttributes, postfix = this.Postfix });
============================================
@dudu: 谢谢

ASP.NET是什么

答:分析: ASP.NET不是一种语言,而是创建动态Web页的一种强大的服务器端技术,它是Microsoft .NET Framework中一套用于生成Web应用程序和Web服务的技术。ASP.NET页在服务器上执行,并生成发送到桌面或浏览器的标记(如 HTML、XML或者WML)。可以使...

asp.net是什么?

答:ASP.Net是什么 1 ASP.Net是什么? ASP.Net是建立在微软新一代.Net平台架构上,利用普通语言运行时(Common Language Runtime)在服务器后端为用户提供建立强大的企业级Web应用服务的编程框架。 2.ASP.Net与ASP的联系和主要区别是什么? ASP.Net...

asp与asp.net有何区别?

答:ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 1、代码逻辑混乱,难于管理:由于...

.Net 和ASP.Net 有什么区别呢?

答:应该这么去说。 .net 分成两个方面 一个是WinForm,另一个就是WebForm 也就是说,一个基于Windows窗体,而另一个是基于Web页面。 Asp.Net就是属于WebForm,也就是平时说的B/S模式的开发。而WinForm就是属于C/S模式 .net有很多种语言组成,比如C#...

ASP.NET State Service可以关闭吗

答:Web.Config文件中关于Session mode 的说明: Custom 会话状态将使用自定义数据存储区来存储会话状态信息。 InProc 会话处于正在处理 ASP.NET 辅助进程的状态。 Off 会话状态被禁用。 SQLServer 会话状态将使用进程外 SQL Server 数据库来存储状...

在ASP.Net中"../" "./" "~/"表示什么意思

答:"../" 相对当前(根据不同的语境,当前是不同的)的上一级目录 "./" 就是当前目录 "~/" 当前项目的根路径,只在服务器端有效。

.net和asp的区别

答:ASP和ASP.NET是2个不同的东西,只是它们都是微软的,在IIS上可以很好的支持,所以可以混用在一起。 ASP是解释型语言,在执行效率上不高,属于过期技术,但网上的源码不少,在开发低成本小网站上还是不错的。 如果ASP.NET网站里混了几页ASP网页,...

ASP.NET是什么意思

答:ASP是英文Active Server Pages的缩写,意为动态服务器页面,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术,其作为一种服务器端应用程序的热门开发工具,在发展中日趋完善并更名为ASP+。后来,微软正式推动.NET策略时,ASP+...

asp.net和.net有什么不一样

答:"你们的意思是ASP.NET只是NET里的一种,也就是好比OFFICE里包含了WORD EXCEL等等....当然用途也就不一样. 是这意思吗?" 你的理解非常正确,可以这么理解。 .net是一个开发平台,我们可以用.net平台用多种语言来开发不同的项目,如.net中有C#.net...

ASP.NET和C#的区别/

答:1、.NET是一个平台,一个抽象的平台的概念。 .NET平台其本身实现的方式其实还是库,抽象层面上来看是一个平台。 个人理解.NET核心就只是.NET Framework。 .NET Framework包括了两个关键组成元素: Common Language Runtime,公共语言运行时 --...


请注意,本站信息均收集自互联网,相关信息仅供参考,医疗等重要信息请以正规途径为最终意见,本站不承担任何责任!

www.wosoni.com false 互联网 http://www.wosoni.com/blogcnk/mm/ccdkgk.html report 4747 解决方案1:建议试试将 [Display(Name = "标题")] 中的 Name 改为不同的名称收获园豆:50============================================[Display(Name = "标题")]你是指将Name的值改掉还是什么?============================================@远扬: 改掉,比如[Display(Name = "标题2")]=====

热门图片