what vs2017 new net features descargar asp c# asp.net-mvc resharper intellisense html-helper

c# - vs2017 - ¿Cómo le dices a Resharper que un parámetro de método es una cadena que contiene una clase de CSS?



resharper vs2017 (1)

[Habilitar intellisense en el atributo HTMLHelper para las clases de css]

Tengo este HTMLhelper:

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

Quiero que Resharper me proporcione IntelliSense para las clases CSS definidas en mi aplicación al pasar el valor para el parámetro "cssClass".

Hay algunos atributos de anotación de código que Resharper reconoce, pero ninguno que parece directamente relacionado con marcar un parámetro de método como clases de CSS.

Lo más cerca que pude encontrar fue [HtmlAttributeValue (string name)] . Intenté aplicar al parámetro cssClass de esta manera:

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

Pero eso no funciona. También sería genial si Resharper reconociera la clase introducida y dejara de molestarme acerca de las clases de CSS desconocidas en las expresiones del selector jQuery (que operan en el cuadro de texto generado por el asistente anterior).

Editar: Aquí hay una captura de pantalla del tipo de intellisense que funciona para el parámetro "htmlAttributes" de un método de acción. Esto se logra utilizando la anotación [HtmlElementAttributes] en el parámetro.

Quiero una anotación similar que me permita poner clases css en un parámetro de cadena y hacer que el mismo intellisense aparezca mostrando clases css.


Utilice [ValueProvider]

A partir de las anotaciones de código actualmente admitidas por Resharper 10, el mejor candidato utilizaría este atributo. Del enlace de arriba:

ValueProviderAttribute

Para un parámetro que se espera que sea uno de los conjuntos de valores limitados. Especifique los campos de qué tipo se deben usar como valores para este parámetro.

Desafortunadamente, no he descubierto cómo funciona. Tal vez tenga errores en mi versión Resharper 9.2.

Lo que he intentado hasta ahora:

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; } } }

Incluso si lo haces funcionar, igual tendrás que completar la lista de valores.

Y, por supuesto, aún puede desarrollar su anotación / extensión de código para Resharper.

¿Por qué no usar un objeto tipeado fuerte en lugar de una cadena?

A veces, en lugar de usar string e int , podríamos usar clases de nuestro propio diseño con caracteres más fuertes. Como parece que controlas tu código, en vez de usar una string con un nombre CSS, puedes crear un nuevo tipo como CssClass .

Solo necesita agregar como evento precompilado una llamada a un generador que analiza cada CSS en el proyecto y crea dinámicamente una clase como esa:

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; } }

y luego su muestra se verá así:

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); } }