проблема с <input asp-for = 'files' /> в помощнике по пользовательским тегам - PullRequest
0 голосов
/ 05 июля 2019

Я создал собственный 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 голосов
/ 05 июля 2019

Посмотрите документ (измените версию, если она неправильная): 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 Class.

[HtmlTargetElement("custominput", TagStructure = TagStructure.WithoutEndTag)] 



Приведенный выше пример игнорирует вашу модель, поэтому я предполагаю, что если вы хотите использовать ее, вам нужно каким-то образом предоставить ее вашему классу TagHelper и соответствующим образом изменить строки SetAttribute.

...