ReSharper 8 + MVC не может разрешить идентификатор

После обновления до ReSharper 8 я начинаю видеть множество предупреждений в своем JavaScript, которых там быть не должно.

На странице Razor .cshtml у меня есть:

@Html.HiddenFor(model => model.Id)
@Html.EditorFor(model => model.Name)

И в JavaScript/jQuery у меня есть:

var id = $('#Id').val();
var name = $('#Name').val();

В новом ReSharper, похоже, добавили правило проверки, которое ищет идентификаторы, соответствующие запросу CSS. Однако он не может вывести идентификаторы из синтаксиса MVC/Razor, поэтому я получаю предупреждения почти для каждого селектора JQuery.

Есть ли способ заставить ReSharper выводить идентификаторы из синтаксиса MVC/Razor? Я знаю, что могу просто отключить правило проверки, но это менее желательно.


person chkimes    schedule 26.07.2013    source источник
comment
Я бы посоветовал разделить ваш javascript на отдельные файлы js. Мало того, что эта проблема будет решена, вы получите много других преимуществ вместе с ней - минимизация, доставка cdn, кэширование файлов и т. Д.   -  person asawyer    schedule 26.07.2013
comment
Я могу подтвердить, что наличие сценария в отдельном файле .js НЕ проясняет ситуацию. ReSharper достаточно умен, чтобы найти соответствующее представление, но все еще не понимает, что идентификатор элемента будет сгенерирован HtmlHelper.   -  person Rich    schedule 13.09.2013


Ответы (1)


Обычно я ненавижу людей, которые не отвечают на вопрос прямо, а предлагают решение типа «почему бы тебе не… вместо этого». А вот и я... ;-) Может быть, вам все еще нравится решение.

Из-за рефакторинга мне недавно удалось сломать код javascript (в основном селекторы jquery), очень похожий на ваш.

Через добавление следующих расширений в HtmlHelper (я их не придумал, нашел в сети)

public static string GetFullHtmlFieldName<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) {
    return helper.ViewData.TemplateInfo.GetFullHtmlFieldName(expression);
}

public static string GetFullHtmlFieldId<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) {
    return helper.ViewData.TemplateInfo.GetFullHtmlFieldId(expression);
}

public static string GetFullHtmlFieldName<TModel, TProperty>(this TemplateInfo templateInfo, Expression<Func<TModel, TProperty>> expression) {
    return templateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
}

public static string GetFullHtmlFieldId<TModel, TProperty>(this TemplateInfo templateInfo, Expression<Func<TModel, TProperty>> expression) {
    return templateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression));
}

Я смог сделать свои селекторы «безопасными по типу модели»:

var id = $('#@Html.GetFullHtmlFieldId(model => model.Id)').val();

Хотя это не является прямым решением вашей проблемы, оно удовлетворит ReSharper, и вы получите дополнительное преимущество «безопасности типа модели». вещи ломаются бесшумно.

person UweB    schedule 26.07.2013
comment
Предоставленный код недействителен, то есть вы не можете назначить «выражение» в виде строки, которая является типом параметра GetFullHtmlField*. Я полагаю, вы хотите использовать: ExpressionHelper.GetExpressionText (выражение) вместо простого выражения. - person Todd Carter; 15.08.2013
comment
+1, извините за позднее продолжение. Вы правы, и причина, по которой здесь все работает нормально, заключается в том, что у меня есть еще два метода расширения, которые выполняют преобразование, как вы описали. Я добавил их в исходное сообщение. - person UweB; 22.08.2013