c# - 컨트롤러 내에서 컨트롤러 및 액션 이름을 가져 옵니까?




asp.net-mvc controller action (12)

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

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

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


Answers

string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.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();
    }
}

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

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

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

다음은 이름을 알아내는 데있어 가장 간단하고 실용적인 답변입니다.

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

또는

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

asp.net mvc로 테스트 위의 코드 5.


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

왜 더 단순하게 지내야하지 않습니까?

Request.Path 호출하면 "/"문자로 구분 된 문자열을 반환합니다.

.Split('/')[1] 을 사용하여 컨트롤러 이름을 얻을 수 있습니다.


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

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

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>

이것은 내가 지금까지 가지고있는 것이다 :

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

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

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

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


축구 팀 축구 선수 목록 이 아닙니다 . 축구 팀 축구 선수 목록으로 구성되어 있습니다 !

이것은 논리적으로 잘못되었습니다.

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal 
}

이 말이 맞습니다.

class FootballTeam 
{ 
    public List<FootballPlayer> players
    public string TeamName; 
    public int RunningTotal 
}






c# asp.net-mvc controller action