- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的简单表单,它使用了@Html.EditorFor 扩展:
<form method="post">
@Html.EditorFor(x => x.SystemSettings.EmailFromAddress)
<submit-button title="Save"></submit-button>
</form>
<form method="post">
<editor asp-for="SystemSettings.EmailFromAddress"/>
<submit-button title="Save"></submit-button>
</form>
<text-box asp-for="SystemSettings.EmailFromAddress"></text-box>
@model string
<div class="form-group">
<label asp-for="@Model" class="m-b-none"></label>
<span asp-description-for="@Model" class="help-block m-b-none small m-t-none"></span>
<div class="input-group">
<input asp-for="@Model" class="form-control" />
<partial name="_ValidationIcon" />
</div>
<span asp-validation-for="@Model" class="validation-message"></span>
</div>
[HtmlTargetElement("editor", TagStructure = TagStructure.WithoutEndTag,
Attributes = ForAttributeName)]
public class EditorTagHelper : TagHelper
{
private readonly IHtmlHelper _htmlHelper;
private const string ForAttributeName = "asp-for";
private const string TemplateAttributeName = "asp-template";
[HtmlAttributeName(ForAttributeName)]
public ModelExpression For { get; set; }
[HtmlAttributeName(TemplateAttributeName)]
public string Template { get; set; }
[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext { get; set; }
public EditorTagHelper(IHtmlHelper htmlHelper)
{
_htmlHelper = htmlHelper;
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (output == null)
throw new ArgumentNullException(nameof(output));
if (!output.Attributes.ContainsName(nameof(Template)))
{
output.Attributes.Add(nameof(Template), Template);
}
output.SuppressOutput();
(_htmlHelper as IViewContextAware).Contextualize(ViewContext);
output.Content.SetHtmlContent(_htmlHelper.Editor(For.Name, Template));
await Task.CompletedTask;
}
}
<input class="form-control valid" type="text" data-val="true" data-val-required="Email From Address cannot be empty" id="SystemSettings_EmailFromAddress" name="SystemSettings.EmailFromAddress" value="whatever@test.com" aria-required="true" aria-invalid="false" aria-describedby="SystemSettings_EmailFromAddress-error">
<input class="form-control valid" type="text" id="SystemSettings_EmailFromAddress" name="SystemSettings.EmailFromAddress" value="whatever@test.com" aria-invalid="false">
public class SystemSettingsValidator : AbstractValidator<SystemSettings>
{
public SystemSettingsValidator()
{
RuleFor(x => x.EmailFromAddress).NotEmpty()
.WithMessage("Email From Address cannot be empty");
}
}
builder.RegisterAssemblyTypes(Assembly.Load(assembly))
.Where(t => t.IsClosedTypeOf(typeof(IValidator<>)))
.AsImplementedInterfaces()
.PropertiesAutowired()
.InstancePerLifetimeScope();
.AddFluentValidation(fv =>
{
fv.RegisterValidatorsFromAssemblies(new List<Assembly>
{Assembly.GetExecutingAssembly(), Assembly.Load(nameof(Entities))});
})
builder.RegisterAutowiredAssemblyInterfaces(Assembly.Load(Web))
.Where(x => !x.Name.EndsWith("TagHelper"));
最佳答案
我相信问题出在标签助手中,因为它使用 IHtmlHelper.Editor
而不是 IHtmlHelper<TModel>.EditorFor
生成 HTML 内容。它们并不完全相同。
正如您所指出的,FluentValidation 会按照您对 @Html.EditorFor(x => x.SystemSettings.EmailFromAddress)
的期望注入(inject)验证属性。 .然而对于 @Html.Editor("SystemSettings.EmailFromAddress")
,这是您的自定义标签助手正在做的事情,FluentValidation 不会注入(inject)验证属性。这样就排除了标签助手本身并将问题转移到 Editor
调用。
我还注意到 Editor
无法解决 <label asp-for
(或您正在使用的其他 <span asp-description-for
标签助手),这表明这不是 FluentValidation 特定的问题。
我无法通过 Required
复制您的成功自定义标签助手的属性/Editor
- Required
属性仅在使用 EditorFor
时注入(inject)验证属性.Editor
的内部结构和 EditorFor
相似但有一个关键区别,它们解决 ModelExplorer
的方式用于生成 HTML 内容的实例不同,我怀疑这是问题所在。有关这些差异,请参见下文。
像 PropertyName
这样的事情设置为 null 和 Metadata.Property
未设置为 Editor
, 但设置为 EmailFromAddress
和 SystemSettings.EmailFromAddress
对于 EditorFor
是我们所看到的行为的潜在原因。
痛苦的部分是标签助手有一个有效的 ModelExplorer
实例通过 For
属性(property)。但是没有内置规定将其提供给 html 帮助程序。
至于分辨率,显而易见的似乎是使用 EditorFor
而不是 Editor
但是看起来并不容易。它可能涉及反射(reflection)和建立表达。
另一种选择是,考虑到标签助手解析 ModelExplorer
正确,是扩展 HtmlHelper
并覆盖 GenerateEditor
方法 - 两者都是Editor
和 EditorFor
最终调用 - 因此您可以传入 ModelExplorer 并解决问题。
public class CustomHtmlHelper : HtmlHelper, IHtmlHelper
{
public CustomHtmlHelper(IHtmlGenerator htmlGenerator, ICompositeViewEngine viewEngine, IModelMetadataProvider metadataProvider, IViewBufferScope bufferScope, HtmlEncoder htmlEncoder, UrlEncoder urlEncoder) : base(htmlGenerator, viewEngine, metadataProvider, bufferScope, htmlEncoder, urlEncoder) { }
public IHtmlContent CustomGenerateEditor(ModelExplorer modelExplorer, string htmlFieldName, string templateName, object additionalViewData)
{
return GenerateEditor(modelExplorer, htmlFieldName, templateName, additionalViewData);
}
protected override IHtmlContent GenerateEditor(ModelExplorer modelExplorer, string htmlFieldName, string templateName, object additionalViewData)
{
return base.GenerateEditor(modelExplorer, htmlFieldName, templateName, additionalViewData);
}
}
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (output == null)
throw new ArgumentNullException(nameof(output));
if (!output.Attributes.ContainsName(nameof(Template)))
{
output.Attributes.Add(nameof(Template), Template);
}
output.SuppressOutput();
(_htmlHelper as IViewContextAware).Contextualize(ViewContext);
var customHtmlHelper = _htmlHelper as CustomHtmlHelper;
var content = customHtmlHelper.CustomGenerateEditor(For.ModelExplorer, For.Metadata.DisplayName ?? For.Metadata.PropertyName, Template, null);
output.Content.SetHtmlContent(content);
await Task.CompletedTask;
}
services.AddScoped<IHtmlHelper, CustomHtmlHelper>();
关于asp.net-core - EditorFor Tag Helper 在使用 FluentValidator 时不呈现验证属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60078465/
link-to帮助程序返回以下错误: Uncaught Error: each doesn't match link-to - 5:10 模板:
默认情况下,ember-cli 生成的帮助程序如下所示: import Ember from 'ember'; export function boundLoc(input) { return i
我正在发现 .Net Core 标签助手,我只是想知道是否有任何标签助手可以复制 @Html.DisplayFor。我认为 label tag helper 复制了 @Html.DisplayName
在本地访问我的 Rails 应用程序时,加载任何页面时出现以下错误: /!\ FAILSAFE /!\ Tue Jul 06 15:08:17 -0500 2010 Status: 500 Inte
m.ResetDayComponent.WeightedAverageMethodID, DropDownData.AveragingMethodList(), "", new { @class =
我正在使用 yii\helpers\Url 助手来访问我网站的菜单中的 url。但是应该有一个 url 去另一个网站,比如 www.anothersite.com/action . 如何通过 yii\
我不确定这是否可能。 我有一堆@Helper位于 View 内以及其他 View 中: @helper ViewHelper1() { ... } @helper ViewHelper2() {
有没有办法在 @helper 声明中访问完整的 @Url 帮助程序对象? 我想做这样的事情...... @helper Button(System.Web.Mvc.ActionResult actio
ASP.Net MVC 6 引入了标签助手功能。 为什么我们应该使用标签助手而不是以前版本提供的 Helper 类? 最佳答案 引入标签助手有几个原因。 Scott Hanselman talks i
我正在尝试从我的 ember.js 应用程序中的另一个助手调用助手,但不知道 blazes 在 2.x 中如何执行此操作。作为引用,我使用 Ember 2.4 和 Ember-CLI。 有几个答案在旧
我想在 Twitter 意图按钮上使用一个图标。 "btn" %> 这可能吗? 页面上还有 2 个其他按钮使用 button_tag 助手,我可以将图标插入到这些按钮中。我应该将 button_to
我一直在基于 Scott Gu's post 在 Razor 中实现一些 @helper 函数,事情进展顺利。 但我想知道的是,是否可以从另一个调用一个 @helper。例如,我有以下助手显示 Dat
我需要创建自定义 html 辅助方法。据我所知有两种方式: 使用@helper razor 语法。 http://weblogs.asp.net/scottgu/archive/2011/05/12/
我刚刚从另一台计算机上克隆了一个我正在使用的存储库。当我尝试通过运行“rake db:migrate”进行数据库迁移时,出现以下错误: AbstractController::Helpers::Mis
我的助手是这样工作的: def some_help(in_string) in_string + " and more" end 但我希望它在输出之前对 执行操作,并且我一直按字面意思获取 字符本
除了在 .Net Core 2 中,我正在尝试解决这个问题。 Can I use a Tag Helper in a custom Tag Helper that returns html? ” 我想
是否可以在另一个 View 助手中使用 View 助手?我们必须查看助手: 帮助我1 use Zend\View\Helper\AbstractHelper; class HelpMe1 extend
Creating MVC3 Razor Helper like Helper.BeginForm() 说它可以使用扩展方法和实现 IDisposable 来完成。可以通过使用声明性 Razor 助手来
所以如果我有一个模板: {{foo}} 和模板助手: Template.myTemplate.foo = function() { blah = Session.get('blah');
我正在尝试为我的 Reddit 机器人运行代码。它可以毫无问题地登录 Reddit,但是当它到达这段代码时,它会抛出一个错误: all_comments = praw.helpers.flatten_
我是一名优秀的程序员,十分优秀!