[C#] 컨트롤러 내에서 컨트롤러 및 작업 이름을 가져 오시겠습니까?

우리의 웹 응용 프로그램의 경우 뷰에 따라 가져 오기 및 표시 된 항목의 순서를 저장해야합니다. 또는 뷰를 생성 한 컨트롤러 및 작업 (및 사용자 ID는 물론 여기서 중요한 것은 아닙니다).

각 컨트롤러 작업에서 식별자를 직접 제공하는 대신 (보기에 따라 DB 출력의 일부 정렬에 사용하기 위해) 컨트롤러와 가져 오는 작업 방법 에서이 식별자를 자동으로 만드는 것이 더 안전하고 쉽다고 생각했습니다. 에서 전화했다.

컨트롤러의 액션 메소드 내에서 컨트롤러 이름과 액션을 어떻게 얻을 수 있습니까? 아니면 그것에 대해 반성이 필요합니까? 미리 감사드립니다.



답변

string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();


답변

해당 정보를 얻는 확장 방법은 다음과 같습니다 (ID도 포함).

public static class HtmlRequestHelper
{
    public static string Id(this HtmlHelper htmlHelper)
    {
        var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;

        if (routeValues.ContainsKey("id"))
            return (string)routeValues["id"];
        else if (HttpContext.Current.Request.QueryString.AllKeys.Contains("id"))
            return HttpContext.Current.Request.QueryString["id"];

        return string.Empty;
    }

    public static string Controller(this HtmlHelper htmlHelper)
    {
        var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;

        if (routeValues.ContainsKey("controller"))
            return (string)routeValues["controller"];

        return string.Empty;
    }

    public static string Action(this HtmlHelper htmlHelper)
    {
        var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;

        if (routeValues.ContainsKey("action"))
            return (string)routeValues["action"];

        return string.Empty;
    }
}

용법:

@Html.Controller();
@Html.Action();
@Html.Id();


답변

유용 할 수 있습니다. 컨트롤러 생성자 에서 작업이 필요했으며 MVC 수명주기 의이 시점에서 나타나고 this초기화되지 않았습니다 ControllerContext = null. MVC 수명주기를 조사하고 재정의 할 적절한 함수 이름을 찾는 대신 방금의 작업을 찾았습니다 RequestContext.RouteData.

그러나 HttpContext생성자의 관련 용도와 마찬가지로 this.HttpContext초기화 하려면 전체 네임 스페이스를 지정해야합니다 . 운 좋게도 System.Web.HttpContext.Current정적입니다.

// controller constructor
public MyController() {
    // grab action from RequestContext
    string action = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetRequiredString("action");

    // grab session (another example of using System.Web.HttpContext static reference)
    string sessionTest = System.Web.HttpContext.Current.Session["test"] as string
}

참고 : HttpContext의 모든 속성에 액세스하는 가장 지원되는 방법은 아니지만 RequestContext 및 Session의 경우 내 응용 프로그램에서 제대로 작동하는 것으로 보입니다.


답변

var routeValues = HttpContext.Current.Request.RequestContext.RouteData.Values;
if (routeValues != null)
{
    if (routeValues.ContainsKey("action"))
    {
        var actionName = routeValues["action"].ToString();
                }
    if (routeValues.ContainsKey("controller"))
    {
        var controllerName = routeValues["controller"].ToString();
    }
}


답변

 @this.ViewContext.RouteData.Values["controller"].ToString();


답변

이것이 내가 지금까지 가진 것입니다.

var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;


답변

이름을 얻는 가장 간단하고 실용적인 답변은 다음과 같습니다.

var actionName = RouteData.Values["action"];
var controllerName = RouteData.Values["controller"];

또는

string actionName = RouteData.Values["action"].ToString();
string controllerName = RouteData.Values["controller"].ToString();

위의 테스트는 asp.net mvc 5.