web-dev-qa-db-ja.com

コントローラ内からコントローラとアクションの名前を取得しますか?

私たちのWebアプリケーションでは、ビューに応じて(正確には)ビューを生成したコントローラーとアクション(およびもちろんユーザーIDですが、これはここでは重要ではありません)に応じて、フェッチして表示する項目の順序を保存する必要があります。

ビューごとにDB出力をソートするために使用するために、各コントローラのアクションで識別子を自分で指定するだけでなく、この識別子をコントローラとアクションメソッドから自動的に作成する方が安全で簡単だと思いました。から呼び出されました。

コントローラのアクションメソッド内からコントローラの名前とアクションを取得する方法を教えてください。それとも私はそれを反映する必要がありますか?私はそれがかなり簡単だと思います、事前に感謝します!

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

その情報を取得するための拡張メソッドがいくつかあります(これには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();
56
John Bubriski

役に立つかもしれません。コントローラのコンストラクタにアクションが必要でしたが、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では、私のアプリケーションではうまく機能するようです。

24
sonjz
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();
    }
}
9
Chris Ballance

これは私がこれまでに持っているものです:

var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
4
user3563149
 @this.ViewContext.RouteData.Values["controller"].ToString();
2

他の変数と同じように、アクションからコントローラ名またはアクション名を取得できます。それらは単に特別なものです(コントローラとアクション)そしてすでに定義されているので、それらを得るために特別なことをする必要はありません。必要だと言って.

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

または、コントローラ、アクションをモデルに含めて、それらのうちの2つとカスタムデータを取得することもできます。

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

ActionおよびController名にはOnActionExecutingの指定行を使用してください。

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

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

1
Bilal Raj

これは(今のところ)私にはうまく機能するようですが、属性ルーティングを使用している場合も機能します。

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");
    }
}
1
joepour

これは、名前を取得するための最も簡単で実用的な答えです。

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でテストの上のコードを書いてください。

0
Matheus Miranda

ToString()呼び出しの必要性を取り除くために

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

これを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>
0
Kurkula