自定义标签帮助程序中的<input asp-for ='files'/>问题

时间:2019-07-05 08:18:58

标签: asp.net-core-tag-helpers

我创建了一个自定义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在上一行中生成相同的输出。 请帮助我

1 个答案:

答案 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行。