[C#] الحصول على وحدة تحكم واسم العمل من داخل وحدة تحكم؟


Answers

في ما يلي بعض طرق الإضافات للحصول على هذه المعلومات (وهي تتضمن أيضًا المعرف):

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

بالنسبة إلى تطبيق الويب الخاص بنا ، أحتاج إلى حفظ ترتيب العناصر التي تم جلبها والعرض بناءً على طريقة العرض - أو على وجه الدقة - وحدة التحكم والإجراء الذي ولّد طريقة العرض (ومعرف المستخدم بالطبع ، ولكن ليس هذا هو الهدف هنا).

بدلاً من مجرد إعطاء معرّف نفسي في كل إجراء متحكم (لكي نستخدمه في بعض الفرز الذي يعتمد على عرض مخرجات 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>



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



استخدم الأسطر المعطاة في OnActionExecuting لاسم الإجراء والتحكم.

string actionName = this.ControllerContext.RouteData.Values ​​["action"]. ToString ()؛

string controllerName = this.ControllerContext.RouteData.Values ​​["controller"]. ToString ()؛




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



يبدو أن هذا يعمل بشكل جيد بالنسبة لي (حتى الآن) ، ويعمل أيضًا إذا كنت تستخدم توجيه السمات.

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