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 #>"...