- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用的是asp core 2.0 MVC,经常在表单中使用这样的代码:
<form asp-controller="Foo" asp-action="Bar">
<div class="form-group">
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control"/>
<span asp-validation-for="Age" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Name"></label>
<input asp-for="Name" class="form-control"/>
<span asp-validation-for="Name" class="text-danger"></span>
</div>
</form>
有没有一种方法可以在 TagHelper 类中组合标签、输入和跨度标签来编写如下内容:
<div class="form-group">
<foo for="Age">
</div>
这将产生以下内容:
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control"/>
<span asp-validation-for="Age" class="text-danger"></span>
为了避免一遍又一遍地为我的属性编写这 3 个常用标签?
提前谢谢你。
编辑:
您好 Isma,谢谢您的回答。您的代码生成纯文本
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control"/>
<span asp-validation-for="Age" class="text-danger"></span>
html。
但我想要像这样的“已处理”版本
<input asp-for="Age"/>
是
<input type="number" data-val="true" data-val-range="The field Age must be between 0 and 100." data-val-range-max="100" data-val-range-min="0" data-val-required="The Age field is required." id="Age" name="Age" value="" />
在 html 中
有什么办法可以实现吗?
最佳答案
这可能对你有用,或者至少让你朝着正确的方向前进,我使用了一个自定义 TagHelper,它使用他们的 TagHelper 实现生成其他元素并附加所有输出(可能有更好/更清晰的方法来做到这一点,顺便说一下)。
[HtmlTargetElement("myfield")]
public class MyFieldTagHelper : TagHelper
{
private IHtmlGenerator _htmlGenerator;
public MyFieldTagHelper(IHtmlGenerator htmlGenerator)
{
_htmlGenerator = htmlGenerator;
}
public string LabelContent { get; set; }
public string ValidationContent { get; set; }
[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }
[HtmlAttributeNotBound]
[ViewContext]
public ViewContext ViewContext { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
var labelContext = CrateTagHelperContext();
var labelOutput = CrateTagHelperOutput("label");
labelOutput.Content.Append(LabelContent);
if (For != null)
{
labelOutput.Attributes.Add("for", For.Name);
}
var label = new LabelTagHelper(_htmlGenerator)
{
ViewContext = ViewContext
};
label.Process(labelContext, labelOutput);
var inputContext = CrateTagHelperContext();
var inputOutput = CrateTagHelperOutput("input");
inputOutput.Attributes.Add("class", "form-control");
var input = new InputTagHelper(_htmlGenerator)
{
For = For,
ViewContext = ViewContext
};
input.Process(inputContext, inputOutput);
var validationContext = CrateTagHelperContext();
var validationOutput = CrateTagHelperOutput("span");
validationOutput.Content.Append(ValidationContent);
validationOutput.Attributes.Add("class", "text-danger");
var validation = new ValidationMessageTagHelper(_htmlGenerator)
{
For = For,
ViewContext = ViewContext
};
validation.Process(validationContext, validationOutput);
output.TagName = "";
output.Content.AppendHtml(labelOutput);
output.Content.AppendHtml(inputOutput);
output.Content.AppendHtml(validationOutput);
}
private static TagHelperContext CrateTagHelperContext()
{
return new TagHelperContext(
new TagHelperAttributeList(),
new Dictionary<object, object>(),
Guid.NewGuid().ToString("N"));
}
private static TagHelperOutput CrateTagHelperOutput(string tagName)
{
return new TagHelperOutput(
tagName,
new TagHelperAttributeList(),
(a,b) =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(string.Empty);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
}
}
现在在你看来你应该能够做到这一点:
<myfield label-content="This is a label" validation-content="Validation content" asp-for="Age"></myfield>
它会为你生成整个区 block 。
请记住在您有标签助手的地方注册程序集,即使您的 Web 应用程序中有它们,您也可以通过编辑文件 Views/_ViewImports.cshtml 并添加以下行来完成此操作:
@addTagHelper *, YourAssemblyName
更多信息:https://learn.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro
关于c# - 合并 TagHelper 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46681692/
有没有办法让 TagHelper 渲染另一个 TagHelper? 示例标签助手; public class OuterTagHelper : TagHelper { public overr
我要触发股票ScriptTagHelper ( view source on GitHub ) 以便模拟 asp-append-version="true"属性。 我知道使用它的正确方法是改变这个:
我正在编写一个简单的分页 TagHelper,我希望输出如下所示: Some Text Some Other Text ... 我的想法是,在定义我的类时,我会生成“a”元
我想知道是否可以从 ASP.Net Core 版本 2.1/2.2 中的子 TagHelper 元素访问父 TagHelper 的属性。 我正在寻找是否有可能建立子级-父级 TagHelper 关系,
这是对 this question 的后续问题,这似乎适用于较旧的 ASP.NET Core 版本(我使用的是 2.1)。 我正在尝试从 TagHelper 中手动调用 TagHelper。应用上面链
在带有 Razor View 的 ASP.NET Core 2.0 项目中,我在运行时加载一个包含 TagHelpers 的程序集。 当 .dll 位于项目的 bin 文件夹中或当 TagHelper
我正在尝试在 MVC 6/ASP.Net vNext 中创建一个自定义标签助手 - taghelper 工作正常,但是有一种方法可以指定有效的 asp- 属性以与标签一起使用,以便它们出现在智能感知?
尝试编写自定义 TagHelper 来显示模型属性的 Description 属性。一切似乎都正常,但描述文本没有传递到我的 ModelExpression 元数据,它仍然是 null。 这是一个 a
带有包含此行的局部 View 我得到以下输出 > 这意味着我需要使用像这样的 Bind 属性在我的操作定义中考虑该“表单”前缀 public async Task SendContactForm(
如果我有这样的标签: Some content 如何获取 TagHelper 中的内容? 我在 TagHelper 或 TagHelperContext 上看不到任何内容。 我正在尝试解析标签的内容。
我使用的是asp core 2.0 MVC,经常在表单中使用这样的代码:
在 C# (ASP.NET Core) 项目中,登录后,站点必须根据用户的权限列出一个带有子菜单的菜单。此菜单出现在所有站点中。基本上是一个仪表板菜单。 这个菜单(子菜单)的内容是动态的,根据用户的许
某些模型属性具有“必需”数据注释,我需要在 TagHelper 类中读取这些注释。 public partial class Sale { [Required] public stri
我正在编写一个自定义 TagHelper 并希望在其中呈现一个 ViewComponent。 类似于 vc:xyz 标记助手所做的事情,但以一种更可控的方式,以便我可以在运行时确定要渲染哪个 View
我创建了一个标签助手,并希望在我的 Blazor 示例项目中使用它。但是,当我想使用标签助手时,编译器会提示: CS0103 当前上下文 FirstBlazorApp 中不存在名称“StartTagH
在链接上指定 asp-controller 和 asp-action 时,同时传递 id 属性的语法是什么? 例如例如,如果我想链接到给定对象的编辑 URL,则所需的 URL 为 /user/edit
我正在尝试创建一个表标记助手,它可以自动解析给定模型中的列和行。 这是它应该如何(理论上使用): 这应该自动显示列名和行。 生成列名并不难,因为我正在传递模型 [HtmlTargetElement
我写了一个标签助手,我需要获取模型属性的类型,因为我想基于它创建一个 html 标签实例。 如果它的类型是Boolean,我想创建Checkbox 的实例等等。 [HtmlTargetElement(
我到处搜索,我想要的基本上是不使用 Controller 或操作上下文的 MVC6 的 RenderViewToString。 由于自定义 TagHelpers 进入了它们自己的类,这些上下文将不可用
在 ASP.NET 5 MVC6 RC1 中——我有一个 ViewComponent,它旨在代表我传统的“屏幕左侧”主菜单。 我正在编写我的第一个 TagHelper 来表示每个菜单项链接。 我卡在了
我是一名优秀的程序员,十分优秀!