2016-01-13 72 views
0

使用以下代码:MVC5定制辅助不能识别模型类型在剃刀视图

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

上面的代码驻留在已被添加到〜/查看/根据需要的web.config的类的名称空间,但我也试过在视图中显式使用@using语句。这两者似乎都不重要。

当我尝试在视图中输入代码,我得到如下:

enter image description here

请注意,在智能感知窗口x参数的类型 - TModel的。当我使用内置的HTML的一个助手,它正确地解决了我的看法的模型,像这样:

enter image description here

在后一种情况下,智能感知适用于所有的车型的性能符合预期,但在前者会崩溃,大概是因为intellisense无法确定x的类型,因此无法解析该类型的属性。为什么智能感知不选择这些信息?

编辑:我贴我的解决方案,以下面的问题的解释,而是因为它是绝对不适用于某些情况下,它是不是一个真正的答案。这看起来像是一个视觉工作室的bug。

+0

您添加的命名空间的配置文件后..你关闭你的所有意见,并重新打开? – JamieD77

+0

当然可以。我尝试关闭所有内容并重新打开,关闭VS并重新打开,删除.vs目录并重新打开等。 – Chris

+0

可能有帮助:http://stackoverflow.com/questions/5109983/why-dont-my-html-helpers-have -intellisense –

回答

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

除了加入这个重载的方法,别无所求,修复了intellisense问题(甚至没有重新加载剃须刀文件,我可能会添加)。

进一步的实验表明,只要参数具有默认值,我就可以向签名添加额外的参数。

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

尝试在web.config文件中添加的命名空间时,追加项目名称:

<add namespace="MyProject.HelperNamespace" />

或者可能会重新启动Visial工作室后,它会工作。

+0

在C#中,项目名称是名称空间的根。这听起来像是一个面向VB开发人员的答案,其中作为命名空间一部分的项目可能并不总是显而易见的。 – Chris