MVC脚手架:在T4模板中获取当前控制器名称和区域名称
MVC Scaffolding: get current controller name and area name in T4 template
当我使用 MVC 脚手架生成它们时,我需要在我的视图中访问当前的 "controller name" 和 "area name"。在控制器模板中,我们有以下参数:
<#@ parameter type="System.String" name="ControllerRootName" #>
<#@ parameter type="System.String" name="AreaName" #>
我的视图模板中需要类似的参数(如列表、创建或详细信息)。我怎样才能访问这两个参数?
这是一个蹩脚的解决方法:
string controllerstring = ViewDataTypeName.Split('.').Last().ToString();
controllerstring = controllerstring + "s";
然后作为其他参数使用:
<a href="@Url.Action("Index","<#= controllerstring #>")" title="@Resources.Cancel">
In The view.ps1 file pass the parameters as follows for creating views
# Render the T4 template, adding the output to the Visual Studio project
$outputPath = Join-Path $outputFolderName $ViewName
Add-ProjectItemViaTemplate $outputPath -Template $Template -Model @{
IsContentPage = [bool]$Layout;
Layout = $Layout;
SectionNames = $SectionNames;
PrimarySectionName = $PrimarySectionName;
ReferenceScriptLibraries = $ReferenceScriptLibraries.ToBool();
ViewName = $ViewName;
PrimaryKeyName = $primaryKeyName;
ViewDataType = [MarshalByRefObject]$foundModelType;
ViewDataTypeName = $foundModelType.Name;
RelatedEntities = $relatedEntities;
MController = $Controller;
MArea = $Area;
} -SuccessMessage "Added $ViewName view at '{0}'" -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$Force
现在在 View T4 模板中使用 MArea 和 MController 获取控制器名称。
示例如下
@using (Ajax.BeginForm("CreateP", "<#= Model.MController #>",
new AjaxOptions
{
HttpMethod = "Post",
UpdateTargetId = "Def",
InsertionMode = InsertionMode.Replace,
LoadingElementId="divloading",
OnSuccess = "done",
OnFailure ="FailureAlert"
}))
如果你像我一样在搭建脚手架之前不更改控制器名称,你可以使用相同的规则创建控制器名称。
起初我在“ModelMetadataFunctions.cs.include.t4”中写了一个函数来从class.
生成控制器名称
string GetControllerName(string className) {
var lastchar = className.Substring(className.Length - 1, 1);
string controllerName = "";
if (lastchar.ToLower() == "y")
{
controllerName = className.Substring(0, className.Length - 1)+"ies";
}
else
{
controllerName = className+"s";
}
return controllerName;
}
然后我在 .T4 模板中调用该函数
string controllerName = GetControllerName(ViewDataTypeShortName);
并像那样使用
<a href="/Panel/<#= controllerName #>/Edit/@Model.<#= pkName #>"...
当我使用 MVC 脚手架生成它们时,我需要在我的视图中访问当前的 "controller name" 和 "area name"。在控制器模板中,我们有以下参数:
<#@ parameter type="System.String" name="ControllerRootName" #>
<#@ parameter type="System.String" name="AreaName" #>
我的视图模板中需要类似的参数(如列表、创建或详细信息)。我怎样才能访问这两个参数?
这是一个蹩脚的解决方法:
string controllerstring = ViewDataTypeName.Split('.').Last().ToString();
controllerstring = controllerstring + "s";
然后作为其他参数使用:
<a href="@Url.Action("Index","<#= controllerstring #>")" title="@Resources.Cancel">
In The view.ps1 file pass the parameters as follows for creating views
# Render the T4 template, adding the output to the Visual Studio project
$outputPath = Join-Path $outputFolderName $ViewName
Add-ProjectItemViaTemplate $outputPath -Template $Template -Model @{
IsContentPage = [bool]$Layout;
Layout = $Layout;
SectionNames = $SectionNames;
PrimarySectionName = $PrimarySectionName;
ReferenceScriptLibraries = $ReferenceScriptLibraries.ToBool();
ViewName = $ViewName;
PrimaryKeyName = $primaryKeyName;
ViewDataType = [MarshalByRefObject]$foundModelType;
ViewDataTypeName = $foundModelType.Name;
RelatedEntities = $relatedEntities;
MController = $Controller;
MArea = $Area;
} -SuccessMessage "Added $ViewName view at '{0}'" -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$Force
现在在 View T4 模板中使用 MArea 和 MController 获取控制器名称。
示例如下
@using (Ajax.BeginForm("CreateP", "<#= Model.MController #>",
new AjaxOptions
{
HttpMethod = "Post",
UpdateTargetId = "Def",
InsertionMode = InsertionMode.Replace,
LoadingElementId="divloading",
OnSuccess = "done",
OnFailure ="FailureAlert"
}))
如果你像我一样在搭建脚手架之前不更改控制器名称,你可以使用相同的规则创建控制器名称。 起初我在“ModelMetadataFunctions.cs.include.t4”中写了一个函数来从class.
生成控制器名称string GetControllerName(string className) {
var lastchar = className.Substring(className.Length - 1, 1);
string controllerName = "";
if (lastchar.ToLower() == "y")
{
controllerName = className.Substring(0, className.Length - 1)+"ies";
}
else
{
controllerName = className+"s";
}
return controllerName;
}
然后我在 .T4 模板中调用该函数
string controllerName = GetControllerName(ViewDataTypeShortName);
并像那样使用
<a href="/Panel/<#= controllerName #>/Edit/@Model.<#= pkName #>"...