3

有没有办法创建一个自定义 ControllerContext 来将现有的 ControllerContext 包装在 mvc 中?

这就是我想要完成的...

出于记录目的,我们需要记录控制器名称、操作名称和页面名称。我们现在从 ControllerContext 对象中获取这些值。

我创建了一个我不太感兴趣的静态类来获取日志记录类的值。

public static class ControllerContextHelper
{
    public static string GetControllerName(ControllerContext context)
    {
        string result = String.Empty;
        if (context.RouteData.Values.ContainsKey("controller"))
        {
            result = context.RouteData.Values["controller"].ToString();
        }
        return result;
    }

    public static string GetActionName(ControllerContext context)
    {
        string result = String.Empty;
        if (context.RouteData.Values.ContainsKey("action"))
        {
            result = context.RouteData.Values["action"].ToString();
        }
        return result;
    }

    public static string GetPageName(ControllerContext context)
    {
        string result = String.Empty;
        if (context.RouteData.Values.ContainsKey("page"))
        {
            result = context.RouteData.Values["page"].ToString();
        }
        return result;
    }
}

我宁愿把这个逻辑放在 ControllorContext 对象中,所以我不需要一个“Helper”类来为我做这件事。

4

1 回答 1

3

您可以为此使用扩展方法

public static class ControllerExtensions
{
    public static string GetControllerName(this ControllerContext context)
    {
        return GetRouteDataValue("controller", context);
    }

    public static string GetActionName(this ControllerContext context)
    {
        return GetRouteDataValue("action", context);
    }

    public static string GetPageName(this ControllerContext context)
    {
        return GetRouteDataValue("page", context);
    }

    private static string GetRouteDataValue(string key, ControllerContext context)
    {
        string value = String.Empty;
        if (context.RouteData.Values.ContainsKey(key))
        {
            value = context.RouteData.Values[key].ToString();
        }
        return value;
    }
}

在您的控制器或任何有可用控制器的地方,您都可以调用扩展方法

public ActionResult Attempt()
{
    var actionName = ControllerContext.GetActionName();
    return View();
}
于 2013-10-02T14:01:01.127 回答