VS2019 Typescript Intellisense для пользовательского htmlэлемента в представлении cshtml

#c# #typescript #asp.net-core #intellisense

#c# #typescript #asp.net-ядро #intellisense

Вопрос:

Если я сделаю что-то подобное в TypeScript app.ts:

 interface Stuff {
    _someStuff: string;
    _someNumberStuff: number;
}

class MyElement extends HTMLElement implements Stuff {

    _someStuff: string;
    _someNumberStuff: number;    

    static get formAssociated() { return false; }
    static get observedAttributes() { return ['someStuff', 'someNumberStuff']; }

    get someStuff() {
        return this._someStuff;
    }
    set someStuff(value: string) {
        this._someStuff = value;
    }
    get someNumberStuff() {
        return this._someNumberStuff;
    }
    set someNumberStuff(value: number) {
        this._someNumberStuff = value;
    }

    constructor() {
        super();
    }

    connectedCallback() {
        this.someStuff = $(this).attr('someStuff');
        this.someNumberStuff = parseFloat($(this).attr('SomeNumberStuff')) || 0;

        this.innerHTML = 'Here is some stuff: <b>'   this.someStuff   '</b> numbers too <code>'   this.someNumberStuff   '</code> and this is your inner html <blockquote>'   this.innerHTML   '</blockquote>';
    }

    disconnectedCallback() {
    }

    attributeChangedCallback(name, oldValue, newValue) {
    }

    adoptedCallback() {
    }
}

customElements.define("my-element", MyElement);
  

Затем в Index.cshtml работает следующее, но я не могу получить Intellisense для атрибутов:

 <my-element someStuff="also stuff">This does stuff.</my-element>
  

Есть ли способ сделать это? Я попробовал это в верхней части cshtml, просто чтобы посмотреть, но это не сработало:

 @{///<reference path="/TypeScript/app.ts"></reference>
}
@{ ///<reference path="/js/app.js"></reference>
}
@{ ///<reference path="/wwwroot/js/app.js"></reference>
}
  

Ответ №1:

 [HtmlTargetElement("my-element", Attributes = "someStuff, someNumberStuff")]
public class MyElementTagHelper : TagHelper
{
    [HtmlAttributeName("someStuff")]
    public string SomeStuff { get; set; }

    [HtmlAttributeName("someNumberStuff")]
    public double SomeNumberStuff { get; set; }
}
  

Переопределение метода Process не требуется, если обработка выполняется в TypeScript, а не на стороне сервера.

В Index.cshtml:

 @addTagHelper *, YourProjectAssembly
  

Будут доступны перестроение и Intellisense.