118

[在 CSS 类的 HTMLHelper 属性上启用智能感知]

我有这个 HTMLhelper:

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

我希望 Resharper 在传递“cssClass”参数的值时为我的应用程序中定义的 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] 注释来完成的。

Resharper htmlAttributes 智能感知

我想要一个类似的注释,让我将 css 类放在一个字符串参数中,并让相同的智能感知显示 css 类。

4

1 回答 1

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 开发代码注释/扩展。

为什么不使用强类型对象而不是字符串?

有时我们可以使用我们自己设计的更强类型的类来代替使用stringand 。int由于您似乎可以控制您的代码,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);
    }
}
于 2016-01-24T17:52:26.947 回答