使用以下代码:
public static IHtmlString RatingDropdown<TModel, TValue>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression,
int start, int max, int? current)
{
var inputName = ExpressionHelper.GetExpressionText(expression);
var select = new TagBuilder("select");
select.MergeAttribute("name", inputName);
foreach (var rating in Enumerable.Range(start, max))
{
var option = new TagBuilder("option");
option.MergeAttribute("value", rating.ToString());
option.SetInnerText(rating.ToString());
if ((current ?? -1) == rating)
{
option.MergeAttribute("selected", "true");
}
select.InnerHtml += option.ToString();
}
return new HtmlString(select.ToString());
}
上面代码所在类的命名空间已根据需要添加到〜/ Views / web.config中,但我也在视图中尝试了一个显式的@using语句。似乎都不重要。
当我尝试在视图中键入代码时,我得到以下内容:
注意智能感知窗口中的x
参数的类型 - TModel。当我使用其中一个内置的html帮助程序时,它会正确解析为我的视图模型,如下所示:
在后一种情况下,intellisense按预期适用于我所有模型的属性,但在前者中,它会发生故障,大概是因为intellisense无法找出x
的类型,因此它无法解析类型的属性。为什么intellisense没有选择这些信息?
编辑: 我在下面的问题中解释了我的解决方案,但这不是一个真正的答案,因为它在某些情况下绝对无效。这对我来说似乎是一个视觉工作室的错误。
答案 0 :(得分:0)
在web.config文件中添加命名空间时尝试附加项目名称:
<add namespace="MyProject.HelperNamespace" />
或者可能在重新启动Visial Studio后,它可以正常工作。
答案 1 :(得分:0)
这非常愚蠢。我不确定它是否是VS中的一个错误,或者它是否有意并且没有在任何地方引用,但为了让intellisense能够接收我的方法,我不得不添加一个接受的重载只有HtmlHelper和Expression参数,即
public static IHtmlString RatingDropdown<TModel, TValue>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression)
{
return RatingDropdown(htmlHelper, expression, 1, 5, null);
}
除了添加此重载方法之外什么都不做,修复了智能感知问题(甚至没有重新加载剃刀文件,我可能会添加)。
进一步的实验表明,我可以在签名中添加其他参数,只要这些参数具有默认值,例如:
public static IHtmlString RatingDropdown<TModel, TValue>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression,
int start = 1, int max = 5)
{
return RatingDropdown(htmlHelper, expression, start, max, -1);
}
但是,以下内容不起作用:
public static IHtmlString RatingDropdown<TModel, TValue>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TValue>> expression,
string testParameter)
{
return RatingDropdown(htmlHelper, expression, 1, 5, -1);
}