Як сказати Resharper, що параметр методу - це рядок, що містить клас CSS?


118

[Увімкнути intellisense на атрибуті HTMLHelper для класів css]

У мене є цей HTMLhelper:

public IHtmlString MyTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TProperty>> propertyExpression, 
    string cssClass)
{
    // ...
}

Я хочу, щоб Resharper дав мені IntelliSense для CSS-класів, визначених у моїй програмі, при передачі значення параметра "cssClass".

Є деякі атрибути кодового кодування, які Resharper розпізнає, але жоден, який, здається, безпосередньо пов'язаний з маркуванням параметра методу як CSS-класи.

Найближчий я міг знайти [HtmlAttributeValue (назва рядка)] . Я намагався застосувати до параметра cssClass, як це:

public IHtmlString MyTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TProperty>> propertyExpression, 
    [HtmlAttributeValue("class")] string cssClass)
{
    // ...
}

Але це не працює. Було б також надзвичайно приємно, якби Resharper розпізнає введений клас і перестане перепитувати мене про невідомі класи CSS у виразах селектора jQuery (які працюють на текстовому полі, згенерованому помічником вище).

Редагувати: Ось скріншот типу intellisense, який працює для параметра "htmlAttributes" методу дії. Це досягається за допомогою анотації [HtmlElementAttributes] для параметра.

Resharper htmlAttributes intellisense

Я хочу, щоб подібна анотація дозволила мені класти css класи в параметр string і мати однакову інтелісценцію, що показує класи css.


10
Відкрите питання про ReSharper багтрекер: youtrack.jetbrains.com/issue/RSRP-389238
Раифа Atef

4
Приємне запитання, я хочу знати і відповідь.
Муртаза Мунші

2
@RaifAtef робить це вже існує в ReSharper, ви могли б додати скріншот того , що ваша мова і просто щоб переконатися , що ви не говорите про stackoverflow.com/questions/529677 / ...
Seabizkit

2
@Seabizkit схожий на інтелігенцію, яку ви отримуєте, коли пишете "return View (" і ви отримуєте інтелігенцію з іменами перегляду або коли ви викликаєте "Html.Action ("), і ви отримуєте intellisense для контролера та імені дії. я просто хочу , щоб ReSharper показати класи мені CSS , коли я входжу значення для параметра CssClass EDIT: Ні моє запитання Diffferent від вашого Yours вбудований в VS річ, мій строго ReSharper пов'язані між собою ...
Раифа Atef

3
@RaifAtef, гаразд .. проблема в тому, що у мене є ReSharper, очевидно, але я не бачу, про яку особливість ReSharper ви говорите ... Я просто бачу нормальний вбудований інтеліссенс ... Мені справді цікаво, як, можливо, я пропущено якусь магію ReSharper, але я її не бачу. Чи можете ви, будь ласка, опублікувати скріншот того, що я повинен бачити. Я спробував з "Html.Action (" та "Html.MyCustomStuff" не бачити різниці між двома. Використовуючи ReSharper 9.1.3, який є одним із останніх.
Seabizkit

Відповіді:


3

Використовуйте [ValueProvider]

З кодових анотацій, які зараз підтримує Resharper 10, найкращий кандидат буде використовувати цей атрибут. З вищенаведеного посилання:

ValueProviderAttribute

Для параметра, який, як очікується, буде одним із обмежених наборів значень. Вкажіть поля, тип яких слід використовувати як значення для цього параметра.

На жаль, я не зрозумів, як це працює. Можливо, це баггі у моїй Resharper версії 9.2.

Що я намагався поки що:

namespace ValueProviderSample
{
    public static class MyValuesContainer
    {
        public static readonly string[] Values = { "one", "two", "three" };
    }

    public class MyMethodContainer
    {
        public string MyMethod([ValueProvider("ValueProviderSample.MyValuesContainer.Values")]
                               string parameter)
        {
            return string.Empty;
        }
    }
}

Навіть якщо ви змусите його працювати, вам все одно доведеться заповнити список цінностей.

І звичайно, ви все ще можете розробити анотацію / розширення коду для Resharper.

Чому б не використовувати сильний набраний об’єкт замість рядка?

Іноді замість того , щоб використовувати stringі int, ми могли б використовувати більш сильні типізовані класи нашої власної конструкції. Оскільки, здається, ви керуєте своїм кодом, ви можете замість того, щоб використовувати stringв ньому ім'я css, створити новий тип типу CssClass.

Вам просто потрібно додати як заздалегідь подій виклик до генератора, який аналізує всі css у проекті та динамічно створює такий клас:

public class CssClass
{
    public string Name { get; private set; }

    public static CssClass In = new CssClass("in");

    /// <summary>
    /// Initialise une nouvelle instance de la classe <see cref="T:System.Object"/>.
    /// </summary>
    private CssClass(string name)
    {
        Name = name;
    }
}

і тоді ваш зразок буде виглядати так:

public class MySample
{
    public IHtmlString MyTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TProperty>> propertyExpression,
        CssClass cssClass)
    {
        // ...
    }

    public void Usage()
    {
        MyTextBoxFor(html, expression, CssClass.In);
    }
}

Це цікаво, але не відповідає на питання, оскільки у ньому не буде всіх класів CSS, якими користується додаток у всіх своїх CSS-файлах.
Райф Атеф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.