2009-09-11 10 views
13

यह बहुत एक और हाल ही सवाल के समान है:एएसपी.नेट एमवीसी - नियंत्रक कोड से वर्तमान कार्रवाई?

How can I return the current action in an ASP.NET MVC view?

हालांकि, मैं नियंत्रक कोड के भीतर से वर्तमान कार्य के नाम पर प्राप्त करना चाहते हैं।

तो किसी एक्शन द्वारा बुलाए जाने वाले फ़ंक्शन के कोड के भीतर, मैं वर्तमान क्रिया के नाम की एक स्ट्रिंग प्राप्त करना चाहता हूं।

क्या यह संभव है?

उत्तर

17

आप इस तरह अपने नियंत्रक वर्ग के भीतर से मार्ग डेटा का उपयोग कर सकते हैं::

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

, या अगर "कार्रवाई" अपने मार्ग का आवश्यक हिस्सा नहीं है यहां कुछ नमूना कोड है , आप सामान्य रूप से रूट डेटा में बस इंडेक्स कर सकते हैं।

1

एकमात्र तरीका जिसे मैं सोच सकता हूं, 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() ; 
    } 
} 
1

ठीक है अगर आप नियंत्रक में हैं तो आप जानते हैं कि कौन सी कार्रवाई कहा जा रहा है। मैं अनुमान लगा रहा हूं कि आपके पास एक कक्षा है जिसका उपयोग नियंत्रक में किया जा रहा है जिसे कॉल की जा रही कार्रवाई के आधार पर अलग-अलग व्यवहार करने की आवश्यकता है। यदि ऐसा है तो मैं उस ऑब्जेक्ट में कार्रवाई का एक स्ट्रिंग प्रतिनिधित्व पास करूंगा जिसे इस विधि को क्रिया विधि के भीतर से जरूरी है। आप से कुछ नमूना कोड वास्तव में स्पष्ट करेंगे कि आपको क्या करने की आवश्यकता है। यहां कुछ नमूना कोड है जो मैं सोच रहा हूं:

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^