通常我讨厌那些不直接回答问题,而是提供“你为什么不……而不是”解决方案的人。然而,我走了...... ;-) 也许你仍然喜欢这个解决方案。
由于重构,我最近设法破坏了与您的非常相似的 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,并且您可以获得“模型类型安全”的额外好处唯一的缺点是它使您的 JavaScript 代码有点难看 - 我个人更喜欢这样事情无声无息地破裂。