> 信息中心 >

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编程.用js动态创建的客户端控件,怎么在服务器端获取控...

1.你动态创建的HTML控件 一定要有个NAME这个属性, 后台就用Request.Form["... 客户端设置服务端控件好像在服务器端是不能识别的,我想在前台生成<Asp:标签名&...

ASP.NET怎么生成生成验证码 ?

然后根据字符串,生成图片,返回到客户端,根据用户输入的字符串和session中字符串对比 2、没有java脚本,只有javascript的,验证码最后用服务端生成,验证码的目的就是恶意攻...

用IIS建ASP站点时无法验证对路径的访问怎么解决

1、打开IIS 7管理器,鼠标单击定位到出现了这个错误的网站。 2、在IIS 7管理器的右边,选择"基本设置"。 3、在弹出的"编辑网站"对话框中,单击"连接为"按钮。 4、在"连接...

asp中用session传递图形验证码不正确

border="0"> 上面这句中的getCode.asp在客户端解析时调用而执行; <% response.write(session("pSN")) %> 这一句是在服务器端运行ASP代码...

ASP.NET怎样生成验证码

{ int intLength = 4; //长度 string strIdentify = "Identify"; //随机字串存储键值,以便存储到Session中 public ValidateImageHandler() {} /// <summary> /// 生成验证图...

asp 用js语言实现登录验证。急急急急急!!!!!

return check();" 然后,在登陆验证页面做ASP服务端验证,目的是为了防止客户端如果禁止了JS,还可以ASP验证,双重保险!在登陆验证页面加入一下代码,你的用户名和密码...

asp.net定义用户控件时,属性持久化和如何动态加载的问题

然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的。 举例说明: Code 2 动...

asp 检测用户是否登录或有无访问权限 要求带验证码

客户端攻击代码,通过一般手段是很难识别验证码的.这样可以确保当前访问是来自一个人而非机器. 编程实现原理:使用某种动态编程语言,比如PHP,ASP,随即生成一个随机数,大...

ASP.NET 动态生成文本框 并且获取值! 也可以用Jquery 实现 只...

).val()); }); }) <body> <form id="form1" runat="server"> <asp:HiddenField ID="hfTxt" runat="server" /> <asp:Butt...

asp.net mvc 如何让视图 不自动生成data-val-xxx 属性

关闭客户端验证功能,在配置文件里


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

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

热门图片