2011-06-24 70 views
4

爲什麼T4MVC生成的代碼中沒有常量字符串?我的猜測是編譯時複製常量值...T4MVC生成的常量沒有?

但是,將常量添加到生成的代碼將允許T4MVC生成的東西在屬性中使用。

我想是這樣的:

插入@line 400:

 public const String ControllerNameCONST = @"<#=controller.ClassName #>"; 

插入@line 445:

 [<#= GeneratedCode #>, DebuggerNonUserCode] 
     public static class ActionNamesCONST { 
<#foreach (var method in controller.ActionMethodsWithUniqueNames) { #> 
<# if (UseLowercaseRoutes) { #> 
      public const string <#=method.ActionName #> =  (<#=method.ActionNameValueExpression #>).ToLowerInvariant(); 
<# } else { #> 
      public const string <#=method.ActionName #> =  <#=method.ActionNameValueExpression #>; 
<# } 
} #> 
     } 

所以有人可能會使用這樣的:

[SomeAttribute(HomeController.ControllerNameCONST)] 
//instead of 
[SomeAttribute("Home")] 
//or 
[SomeAttribute(HomeController.ActionNamesCONST.SomeAction)] 
//instead of 
[SomeAttribute("SomeAction")] 

編輯:用它作爲模型上的自動完成屬性,因此可以在模型上指定「目標」控制器和操作。儘管可以重寫autocomplete屬性以將ActionResult作爲參數而不是控制器+動作名稱...

回答

5

更新(12/7/2011):此問題現在已修復(在2.6.65)。見http://mvccontrib.codeplex.com/workitem/7177


T4MVC的確產生了很多常量。例如

對於控制器名稱:MVC.Home.Name

對於動作名稱:MVC.Home.ActionNames.About

對於視圖名稱:MVC.Home.Views.About

+1

是的,我知道,但這些都是隻讀 「常量」,不C#「常量」。所以不能在一個屬性中使用它們,因爲你得到了編譯時錯誤:「一個屬性參數必須是一個常量表達式,typeof表達式或者屬性參數類型的數組創建表達式」 –

+2

啊我明白了。對,它今天不這樣做。很難做到的一點是,它不能像MVC那樣被訪問。*就像T4MVC產生的其餘部分一樣。 –

+0

@DavidEbbo,對於MVC.Controller.Name作爲歷史管理服務器端的人來說,它是非常有用的C#常量。這樣它們可以在重定向邏輯的switch語句中使用。 – rstackhouse