MVC5自定义帮助程序无法识别剃刀视图中的模型类型

时间:2016-01-13 19:50:39

标签: asp.net-mvc asp.net-mvc-5 visual-studio-2015

使用以下代码:

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语句。似乎都不重要。

当我尝试在视图中键入代码时,我得到以下内容:

enter image description here

注意智能感知窗口中的x参数的类型 - TModel。当我使用其中一个内置的html帮助程序时,它会正确解析为我的视图模型,如下所示:

enter image description here

在后一种情况下,intellisense按预期适用于我所有模型的属性,但在前者中,它会发生故障,大概是因为intellisense无法找出x的类型,因此它无法解析类型的属性。为什么intellisense没有选择这些信息?

编辑: 我在下面的问题中解释了我的解决方案,但这不是一个真正的答案,因为它在某些情况下绝对无效。这对我来说似乎是一个视觉工作室的错误。

2 个答案:

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