c# - mvc - net core routing




컨트롤러 내에서 컨트롤러 및 액션 이름을 가져 옵니까? (9)

액션 및 컨트롤러 이름으로 OnActionExecuting에서 지정된 줄을 사용하십시오.

문자열 actionName = this.ControllerContext.RouteData.Values ​​[ "action"]. ToString ();

문자열 controllerName = this.ControllerContext.RouteData.Values ​​[ "controller"]. ToString ();

우리의 웹 애플리케이션의 경우보기에 따라 가져온 표시 항목의 순서를 저장해야합니다. 정확하게 말해서보기를 생성 한 컨트롤러와 동작 (물론 사용자 ID도 여기에 그 지점이 아닙니다.)을 저장해야합니다.

각 컨트롤러 액션에서 ID를 제공하는 대신 (DB 출력의 일부 뷰 종속 정렬을 위해 식별자를 사용하기 위해) 컨트롤러와 액션 메소드에서이 식별자를 자동으로 생성하는 것이 더 안전하고 쉬울 것이라고 생각했습니다. 에서 전화했다.

컨트롤러의 액션 메소드 내에서 컨트롤러와 액션의 이름을 어떻게 얻을 수 있습니까? 아니면 그에 대한 반성이 필요합니까? 나는 그것이 쉽다는 것을 짐작한다, 미리 감사하십시오!


GetDefaults () 메서드 내에서 기본 컨트롤러에 추가하십시오.

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         GetDefaults();
         base.OnActionExecuting(filterContext);
    }

    private void GetDefaults()
    {
    var actionName = filterContext.ActionDescriptor.ActionName;
    var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    }

Basecontroller에 컨트롤러 구현하기

_Breadcrumb.cshtml 부분 뷰를 추가하고 @Html.Partial ( "_ Breadcrumb")과 함께 필요한 모든 페이지에 추가하십시오.

_Breadcrumb.cshtml

<span>
    <a href="../@ViewData["controllerName"]">
        @ViewData["controllerName"]
    </a> > @ViewData["actionName"]
</span>

다음은 정보를 가져 오는 몇 가지 확장 방법입니다 (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();

어떤 변수와 마찬가지로 액션에서 컨트롤러 이름이나 액션 이름을 얻을 수 있습니다. 그것들은 단지 특별 (컨트롤러와 액션) 이며 이미 정의되어 있으므로 필요 없다는 것을 제외하고는 특별한 것을 할 필요가 없습니다.

public string Index(string controller,string action)
   {
     var names=string.Format("Controller : {0}, Action: {1}",controller,action);
     return names;
   }

또는 컨트롤러와 액션을 모델에 포함시켜 두 모델과 맞춤 데이터를 가져올 수 있습니다.

public class DtoModel
    {
        public string Action { get; set; }
        public string Controller { get; set; }
        public string Name { get; set; }
    }

public string Index(DtoModel baseModel)
    {
        var names=string.Format("Controller : {0}, Action: {1}",baseModel.Controller,baseModel.Action);
        return names;
    }

유용 할 수도 있습니다. 컨트롤러의 생성자 에서 액션이 필요했으며 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 내 응용 프로그램에서 제대로 작동하는 것으로 보입니다.


이것은 나를 위해 멋지게 작동하는 것처럼 보인다 (지금까지), 당신이 속성 라우팅을 사용하는 경우에도 작동합니다.

public class BaseController : Controller
{
    protected string CurrentAction { get; private set; }
    protected string CurrentController { get; private set; }

    protected override void Initialize(RequestContext requestContext)
    {
        this.PopulateControllerActionInfo(requestContext);
    }

    private void PopulateControllerActionInfo(RequestContext requestContext)
    {
        RouteData routedata = requestContext.RouteData;

        object routes;

        if (routedata.Values.TryGetValue("MS_DirectRouteMatches", out routes))
        {
            routedata = (routes as List<RouteData>)?.FirstOrDefault();
        }

        if (routedata == null)
            return;

        Func<string, string> getValue = (s) =>
        {
            object o;
            return routedata.Values.TryGetValue(s, out o) ? o.ToString() : String.Empty;
        };

        this.CurrentAction = getValue("action");
        this.CurrentController = getValue("controller");
    }
}

ToString() 호출에 대한 필요성을 제거하려면 다음을 사용하십시오.

string actionName = ControllerContext.RouteData.GetRequiredString("action");
string controllerName = ControllerContext.RouteData.GetRequiredString("controller");

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

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();
    }
}




action