[cssクラスのHTMLHelper属性でインテリセンスを有効にする]
私はこのHTMLhelperを持っています:
public IHtmlString MyTextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> propertyExpression,
string cssClass)
{
// ...
}
「cssClass」パラメーターの値を渡すときに、Resharperにアプリケーションで定義されたCSSクラスのIntelliSenseを提供してもらいたいです。
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」パラメーターで機能している種類のインテリセンスのスクリーンショットです。これは、パラメーターの[HtmlElementAttributes]アノテーションを使用して実現されます。
Cssクラスを文字列パラメーターに入れて同じインテリセンスを表示させてcssクラスを表示できる同様のアノテーションが必要です。
Code Annotations 現在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
とint
を使用する代わりに、独自の設計のより強力な型クラスを使用できる場合があります。コードを制御しているように見えるので、css名を含むstring
を使用する代わりに、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);
}
}