1

ActionDescriptorアクションとそのコントローラーに関する情報を取得する があります。

ActionDescriptor desc = ...;
string action = desc.ActionName;
string controller = desc.ControllerDescriptor.ControllerName;
string area = ?;

私が現在行っている名前空間を解析するよりも、コントローラーの領域を決定するためのより良い方法があるかどうか疑問に思っています。

// e.g., Company.Areas.Foo.Controllers
var parts = desc.ControllerDescriptor.ControllerType.Namespace.Split('.').ToList();
var areaIndex = parts.IndexOf("Areas");
if (areaIndex > -1) area = parts[areaIndex + 1];
// area = "Foo"

編集:

私はビューやコントローラーのコンテキストではなく、そのType情報などからのみ領域を特定しようとしていることを明確にする必要があります。

4

3 に答える 3

2

すべてのコントローラーでこれを機能させるために、私がスクランブルしたものは次のとおりです。

private string findAreaForControllerType(Type controllerType)
{
    var areaTypes = getAllAreasRegistered();

    foreach (var areaType in areaTypes)
    {
        if (controllerType.Namespace.StartsWith(areaType.Namespace))
        {
            var area = (AreaRegistration)Activator.CreateInstance(areaType);
            return area.AreaName;
        }
    }
    return string.Empty;
}

private IEnumerable<Type> getAllAreasRegistered()
{
    var assembly = getWebEntryAssembly();
    var areaTypes = assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(AreaRegistration)));

    return areaTypes;
}

static private Assembly getWebEntryAssembly()
{
    if (System.Web.HttpContext.Current == null ||
        System.Web.HttpContext.Current.ApplicationInstance == null)
    {
        return null;
    }

    var type = System.Web.HttpContext.Current.ApplicationInstance.GetType();
    while (type != null && type.Namespace == "ASP")
    {
        type = type.BaseType;
    }

    return type == null ? null : type.Assembly;
}

これにより、Web プロジェクト アセンブリからすべての AreaRegistration 型がフェッチされ、コントローラーの名前空間が領域の名前空間に一致します。つまり、タイプのコントローラがある場合My.WebProject.Areas.Admin.UserController、システムは名前空間の一致に基づいて管理領域を返しますMy.WebProject.Areas.Admin

于 2015-06-17T06:49:43.380 に答える