118

[css クラスの HTMLHelper 属性でインテリセンスを有効にする]

私はこのHTMLヘルパーを持っています:

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

「cssClass」パラメーターの値を渡すときに、アプリケーションで定義された CSS クラスの IntelliSense を Resharper に提供してもらいたいです。

Resharper が認識するコード アノテーション属性がいくつかありますが、メソッド パラメーターを CSS クラスとしてマークすることに直接関係していると思われるものはありません。

私が見つけた最も近いものは[HtmlAttributeValue(string name)]でした。次のように cssClass パラメータに適用しようとしました。

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

しかし、それはうまくいきません。また、Resharper が入力されたクラスを認識し、jQuery セレクター式 (上記のヘルパーによって生成されたテキスト ボックスで動作する) の未知の CSS クラスについて私を悩ませるのをやめてくれれば、それは非常に素晴らしいことです。

編集: これは、アクション メソッドの "htmlAttributes" パラメーターに対して機能している種類の IntelliSense のスクリーンショットです。これは、パラメーターで [HtmlElementAttributes] 注釈を使用することによって実現されます。

Resharper htmlAttributes インテリセンス

文字列パラメーターに css クラスを配置し、css クラスを示す同じインテリセンスを表示できる同様の注釈が必要です。

4

1 に答える 1

3

[ValueProvider] を使用

Resharper 10 で現在サポートされているコード注釈から、この属性を使用するのが最良の候補です。上記のリンクから:

ValueProviderAttribute

限られた値のセットの 1 つであると予想されるパラメーターの場合。このパラメーターの値として使用する必要があるタイプのフィールドを指定します。

残念ながら、私はそれがどのように機能するかを理解していません。私の 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 の代わりに強い型付けされたオブジェクトを使用しないのはなぜですか?

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);
    }
}
于 2016-01-24T17:52:26.947 に答える