195

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

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

コントローラーのアクションメソッド内からコントローラーとアクションの名前を取得するにはどうすればよいですか? それとも、そのために反省が必要ですか?

4

13 に答える 13

372
string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
于 2013-08-15T08:06:51.243 に答える
73

その情報を取得するためのいくつかの拡張メソッドを次に示します (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();
于 2014-10-03T18:20:31.950 に答える
24

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

于 2013-10-24T15:58:42.213 に答える
4

名前を取得するための最も簡単で実用的な答えは次のとおりです。

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 でテストします。

于 2017-06-26T14:15:33.257 に答える
4

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

var actionName = filterContext.ActionDescriptor.ActionName;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
于 2015-11-09T22:30:46.990 に答える
2

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

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");
    }
}
于 2016-01-16T02:50:14.107 に答える
2

これを 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>
于 2017-02-21T19:22:08.630 に答える
1

変数のようにアクションからコントローラー名またはアクション名を取得できます。それらは単なる特別なもの(コントローラーとアクション)であり、既に定義されているため、それらが必要であることを伝える以外に、それらを取得するために特別なことをする必要はありません。

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

または、モデルに controller 、 action を含めて、そのうちの 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;
    }
于 2015-07-31T15:02:05.070 に答える
-8

もっとシンプルなものを持っていないのはなぜですか?

を呼び出すだけRequest.Pathで、「/」で区切られた文字列が返されます

次に.Split('/')[1]、コントローラー名を取得するために使用できます。

ここに画像の説明を入力

于 2016-04-05T03:12:49.420 に答える