2011-10-21 51 views
0

我應該使用List模板尊重的其他屬性,還是我堅持不得不手動將源代碼更改爲DisplayFor(m => m.someProperty)?爲什麼看起來List Scaffold Template不尊重DisplayName屬性?

我在另一個線程讀取ExpressionHelper.GetExpressionText應使用一個建議,但是這不正是我要找的。我想讓IDE的添加視圖嚮導爲列表工作,就像它爲其他腳手架模板一樣,我希望有一個屬性可以用在我的屬性上來完成。

+0

表模板,你說的是自帶使用'添加View'對話框自動生成的支架?如果是這樣,那麼實際的'DisplayFor'是'DisplayFor(m => item.SomeProperty)'。 – Buildstarted

+0

正確,但DisplayFor不能用於列標題(TH元素自動生成);因爲該模型是一個IEnumerable。我正在尋找的是讓IDE自動填充具有在DisplayName屬性中找到的正確名稱的標題列。 –

回答

0

這是因爲列表可能是空的,用一個空的列表,你必須你的得到的顯示名稱類型的實例不能訪問。因此,您失去了對所引用的特定屬性的鍵入訪問權限。

比如你怎麼知道用哪個屬性的顯示名稱,如果你沒有訪問對象

<th>@Html.DisplayFor(f => f...., 
      /* 
       how do you get the property you want to 
       access here if the list is empty 
      */ 
    )</th> 

你可以寫,將接受課程的模式類型的擴展方法,但你會失去這種類型的訪問。

public static IHtmlString DisplayType(this HtmlHelper html, Type modelType, string propertyName) { 
    object modelInstance = Activator.CreateInstance(modelType); 
    var data = ModelMetadata.FromStringExpression(propertyName, 
         new ViewDataDictionary(modelInstance)); 
    return new HtmlString(data.DisplayName ?? propertyName); 
} 


@Html.DisplayType(typeof(CoolModel), "Name") 

雖然我不真的推薦它。

小更新 - 你也可以通過模型訪問它很好,但仍然沒有類型訪問:

public static IHtmlString DisplayType<TModel, TValue>(this HtmlHelper<TModel> html, 
      Expression<Func<TModel, TValue>> expression, 
      string propertyName) where TModel : IEnumerable { 
    object modelInstance = 
       Activator.CreateInstance(expression.Body.Type.GetGenericArguments()[0]); 

    var data = ModelMetadata.FromStringExpression(propertyName, 
          new ViewDataDictionary(modelInstance)); 
    return new HtmlString(data.DisplayName ?? propertyName); 
} 
+0

太棒了,所以這是數百萬美元的問題;當我想自動生成我的列表視圖時,如何擴展Visual Studio以生成HtmlHelper擴展,以便我不必手動執行?它甚至有可能做到嗎? –

+0

您必須使用[MvcScaffolding](http://nuget.org/List/Packages/MvcScaffolding)創建您自己的T4模板,這是一件很遺憾的事,我沒有什麼經驗。這裏有一個[博客文章](http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/)以及更多信息。 – Buildstarted

+0

謝謝,我一定會考慮一下!順便說一句,我重寫了擴展名,以便實例化一個實例不是必需的。 –