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作爲參數而不是控制器+動作名稱...
是的,我知道,但這些都是隻讀 「常量」,不C#「常量」。所以不能在一個屬性中使用它們,因爲你得到了編譯時錯誤:「一個屬性參數必須是一個常量表達式,typeof表達式或者屬性參數類型的數組創建表達式」 –
啊我明白了。對,它今天不這樣做。很難做到的一點是,它不能像MVC那樣被訪問。*就像T4MVC產生的其餘部分一樣。 –
@DavidEbbo,對於MVC.Controller.Name作爲歷史管理服務器端的人來說,它是非常有用的C#常量。這樣它們可以在重定向邏輯的switch語句中使用。 – rstackhouse