自定义ControllerContext

时间:2013-10-02 13:49:03

标签: asp.net-mvc-4

有没有办法创建自定义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”类来为我做这个。

1 个答案:

答案 0 :(得分: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();
}