2016-01-13 69 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