我创建了一个自定义tagHelper。 但是我在开发显示的代码段时遇到了一个问题(输入asp-for =“ files”完全传输到浏览器)。
public override void Process(TagHelperContext context, TagHelperOutput output){
var form = @"<form id='uploadFileForm' method='post' enctype='multipart/form-data' >
<input asp-for='files' />
<input type = 'button' id ='btnUpload' value =' upload' />
</form > ";
output.PreContent.AppendHtmlLine(form);}
和我的模特:
[Required(ErrorMessage = "Please select a file.")]
[DataType(DataType.Upload)]
public IList<IFormFile> files { get; set; }
更多说明:使用
时<input asp-for='files' />
在视图中,最终在 浏览器:
<input type="file" data-val="true" data-val-required="Please select a file." id="files" multiple="multiple" name="files" />
现在,我不知道要在tagHelper中做什么以通过taghelper在上一行中生成相同的输出。 请帮助我
答案 0 :(得分:0)
看一下文档(如果版本不正确,请更改版本):https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring?view=aspnetcore-2.2
从那里的示例中收集,您正在寻找的内容应如下所示
(未经测试的示例):
public override void Process(TagHelperContext context, TagHelperOutput output){
// Should already be input, but in case you want to change it to something else
output.TagName = "input";
// remove the old attribute
// You probably need to do something different if you want to carry over the attribute
output.Attributes.RemoveAll("asp-for");
output.Attributes.SetAttribute("type", "file");
output.Attributes.SetAttribute("data-val", "true");
output.Attributes.SetAttribute("data-val-required", "Please select a file.");
output.Attributes.SetAttribute("id", "files");
output.Attributes.SetAttribute("multiple", "multiple");
output.Attributes.SetAttribute("name", "files");
}
我不确定您是否真的可以将其用于预定义的标签(例如输入),如果您创建自定义标签(尚不存在的标签)可能会更好。
您尚未发布所用注释的任何示例,可以说您将其更改为:
<custominput asp-for='files' />
那么TagHelper类上应该有类似的东西。
[HtmlTargetElement("custominput", TagStructure = TagStructure.WithoutEndTag)]
上面的示例忽略了您的模型,因此我假设如果要使用它,则需要以某种方式将其提供给TagHelper类,并相应地更改SetAttribute行。