ASP.NET MVC - العمل الحالي من التعليمات البرمجية تحكم؟

StackOverflow https://stackoverflow.com/questions/1408743

سؤال

وهذه هي مشابهة جدا لسؤال آخر حديث:

كيف يمكنني العودة للعمل الحالي في طريقة عرض ASP.NET MVC؟

ولكن، أريد الحصول على اسم الإجراء الحالي من داخل <م> تحكم التعليمات البرمجية.

وهكذا ضمن رمز وظيفة الذي يتم استدعاؤها بواسطة العمل، أريد الحصول على سلسلة من اسم العمل الحالي.

هل هذا ممكن؟

هل كانت مفيدة؟

المحلول

ويمكنك الوصول إلى البيانات الطريق من داخل الطبقة حدة التحكم الخاصة بك مثل هذا:

وvar actionName = ControllerContext.RouteData.GetRequiredString("action");

وأو، إذا "العمل" ليست جزءا المطلوب من مسارك، يمكنك مؤشر فقط إلى البيانات الطريق حسب المعتاد.

نصائح أخرى

والطريقة الوحيدة التي يمكنني أن أفكر، هو استخدام في الدرجة StackFrame . وأود أن لا يوصي إذا كنت تتعامل مع أداء كود حرج، ولكن هل يمكن استخدامها. المشكلة الوحيدة هي أن StackFrame يوفر لك جميع الطرق التي تم استدعاؤهم إلى هذه النقطة، ولكن ليس هناك طريقة سهلة لتحديد أي من هذه هي طريقة العمل، ولكن ربما في حالتك أنت تعرف كم عدد طبقات فوق العمل سوف يكون. وإليك بعض التعليمات البرمجية:

[HandleError]
public class HomeController : Controller
{
    public void Index()
    {
        var x = ShowStackFrame();
        Response.Write(x);
    }

    private string ShowStackFrame()
    {
        StringBuilder b = new StringBuilder();
        StackTrace trace = new StackTrace(0);

        foreach (var frame in trace.GetFrames())
        {
            var method = frame.GetMethod();
            b.AppendLine(method.Name + "<br>");

            foreach (var param in method.GetParameters())
            {
                b.AppendLine(param.Name + "<br>");
            }
            b.AppendLine("<hr>");
        }

        return b.ToString() ;
    }
}

وكذلك إذا كنت في وحدة تحكم تعلمون ما هي الإجراءات يتم استدعاء. وأنا على التخمين أن لديك فئة التي يتم استخدامها في وحدة التحكم التي يجب أن تتصرف بشكل مختلف على أساس الإجراء الذي يتم استدعاء. إذا كان هذا هو الحال بعد ذلك أود أن تمرير تمثيل سلسلة من العمل في الكائن الذي يحتاج هذه المعلومات من داخل طريقة العمل. فإن بعض نموذج التعليمات البرمجية منك توضيح حقيقة ما كنت تحتاج إلى القيام به. وفيما يلي بعض نموذج التعليمات البرمجية التي أفكر:

public ActionResult TestControllerAction()
{
     var action = new TestControllerAction();
     var objectWithBehaviorBasedOnAction = new MyObjectWithBehaviorBasedOnAction();
     objectWithBehaviorBasedOnAction.DoSomething(action);    
}

public class MyObjectWithBehaviorBasedOnAction: IMyBehaviorBasedOnAction
{
    public void DoSomething(IControllerAction action)
    {
      // generic stuff
    }
    public void DoSomething(TestControllerAction action)
    {
       // do behavior A
    }
    public void DoSomething(OtherControllerAction action)
    {
        // do behavior b
    }
}

public interface IMyBehaviorBasedOnAction
{
   void DoSomething(IControllerAction action);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top