MVC में ChildActionOnly का उपयोग करना


168

आप विशेषता का उपयोग कब करेंगे ChildActionOnly? क्या है ChildActionऔर इस परिस्थिति में आप इस विशेषता का उपयोग करके किसी कार्रवाई को कैसे प्रतिबंधित करना चाहते हैं?

जवाबों:


161

ChildActionOnlyविशेषता यह सुनिश्चित करता है कि एक कार्रवाई विधि एक दृश्य के भीतर से ही एक बच्चे के तरीके के रूप में कहा जा सकता है। एक एक्शन मेथड को इस एक्टिविटी को चाइल्ड एक्शन के रूप में इस्तेमाल करने की आवश्यकता नहीं है, लेकिन हम एक्शन विधियों को यूजर रिक्वेस्ट के परिणामस्वरूप मंगवाने से रोकने के लिए इस विशेषता का उपयोग करते हैं। एक एक्शन विधि को परिभाषित करने के बाद, हमें यह बनाने की आवश्यकता है कि एक्शन लागू होने पर क्या प्रदान किया जाएगा। बाल क्रियाएं आम तौर पर आंशिक विचारों से जुड़ी होती हैं, हालांकि यह अनिवार्य नहीं है।

  1. [ChildActionOnly] दृश्य में कोड के माध्यम से प्रतिबंधित पहुंच की अनुमति

  2. विशिष्ट पृष्ठ URL के लिए राज्य सूचना कार्यान्वयन। उदाहरण: भुगतान पृष्ठ URL (केवल एक बार भुगतान) रेजर सिंटैक्स विशिष्ट कार्यों को सशर्त कॉल करने की अनुमति देता है


एक दृश्य में उदाहरण का उपयोग करें: <% Html.RenderAction ("MyChildAction", "MyController"); %>। इस प्रकार आप GET और रूटिंग के साथ एक बच्चे की कार्रवाई को नहीं बुला सकते हैं
एरिक बर्गस्टेड

12
उदाहरण कोड: @ क्लार्क-केंट // example from Music Store // GET: /ShoppingCart/CartSummary [ChildActionOnly] public ActionResult CartSummary() { // your stuff } /ShoppingCart/CartSummary will return "The action 'CartSummary' is accessible only by a child request." तो आप सीधे एक निश्चित नियंत्रक को एक GET को रोकते हैं, लेकिन केवल किसी अन्य नियंत्रक / कार्रवाई के भीतर से। पसंद: _पार्टियल विचार।
लैंग्लेप्पेल

1
InvalidOperationExceptionजब <ChildActionOnly>ब्राउज़र के माध्यम से एक विधि को चिह्नित किया जाता है , तो सबसे अच्छा कैसे पकड़ें ?
बर्नहार्ड डब्लर

मुझे @ Html.Action :) का उपयोग करना था
क्रिस

125

साथ [ChildActionOnly] विशेषता उसकी व्याख्या, एक कार्रवाई विधि केवल एक दृश्य के भीतर से एक बच्चे को विधि के रूप में कहा जा सकता है। यहाँ [ChildActionOnly] के लिए एक उदाहरण है

दो कार्य विधियाँ हैं: अनुक्रमणिका () और MyDateTime () और संबंधित दृश्य: Index.cshtml और MyDateTime.cshtml। यह HomeController.cs है

public class HomeController : Controller
 {
    public ActionResult Index()
    {
        ViewBag.Message = "This is from Index()";
        var model = DateTime.Now;
        return View(model);
    }

    [ChildActionOnly]
    public PartialViewResult MyDateTime()
    {
        ViewBag.Message = "This is from MyDateTime()";

        var model = DateTime.Now;
        return PartialView(model);
    } 
}

यहाँ Index.cshtml के लिए दृश्य है

@model DateTime
@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
<div>
    This is the index view for Home : @Model.ToLongTimeString()
</div>
<div>
    @Html.Action("MyDateTime")  // Calling the partial view: MyDateTime().
</div>

<div>
    @ViewBag.Message
</div>

यहाँ MyDateTime.cshtml आंशिक दृश्य है।

@model DateTime

<p>
This is the child action result: @Model.ToLongTimeString()
<br />
@ViewBag.Message
</p>
 यदि आप एप्लिकेशन चलाते हैं और यह अनुरोध करते हैं http: // localhost: 57803 / home / mydatetime
 परिणाम सर्वर त्रुटि की तरह होगा:

यहां छवि विवरण दर्ज करें

इसका मतलब है कि आप सीधे आंशिक दृश्य को कॉल नहीं कर सकते। लेकिन इसे Index.cshtml की तरह इंडेक्स () व्यू के जरिए बुलाया जा सकता है

     @ Html.Action ("MyDateTime") // आंशिक दृश्य को कॉल करना: MyDateTime ()।
 

यदि आप [ChildActionOnly] को हटाते हैं और http: // localhost: 57803 / home / mydatetime का समान अनुरोध करते हैं, तो यह आपको माइडेटटाइम आंशिक दृश्य परिणाम प्राप्त करने की अनुमति देता है:
This is the child action result. 12:53:31 PM 
This is from MyDateTime()

मुझे लगता है कि यह स्पष्टीकरण एक "पूर्ण विराम" था, धन्यवाद पुरुष
TAHA SULTAN TEMURI

लेकिन इसका उपयोग करके NonActionभी प्राप्त किया जा सकता है , इससे क्या फर्क पड़ता है?
इमाद

74

यदि आप RenderActionअपने किसी भी दृष्टिकोण में उपयोग कर रहे हैं , तो आमतौर पर आंशिक दृश्य प्रस्तुत करने के लिए आप इसका उपयोग करेंगे ।

इसके साथ चिन्हित करने का कारण यह [ChildActionOnly]है कि आपको सार्वजनिक होने के लिए नियंत्रक विधि की आवश्यकता है ताकि आप इसे कॉल कर सकें, RenderActionलेकिन आप नहीं चाहते कि कोई व्यक्ति URL पर नेविगेट करने में सक्षम हो (जैसे / नियंत्रक / SomeChildAction) और उसके परिणाम देखें सीधे कार्रवाई।


2
इसी तरह की [गैर-व्यवस्था]। क्या यह? फिर क्या अंतर है?
डार्थवेडर

10
@DarthVader - समान है, लेकिन [NonAction] के साथ आप नहीं का उपयोग कर इसे कहते करने में सक्षम होगा RenderActionया तो
एरिक Petroelje

@ EricPetroelje: NonActionAttributeअसली प्रोजेक्ट्स की तरह एक्शन विधि को चिह्नित करने के क्या लाभ हो सकते हैं ?
वुच्च्डक

1
@ पंकज - ईमानदारी से, मैं वास्तव में अच्छे कारणों के बारे में नहीं सोच सकता। यदि आप नहीं चाहते हैं कि URL के माध्यम से कंट्रोलर पर कोई विधि उपलब्ध हो, तो सबसे अच्छा समाधान बस विधि बनाना होगा privateया protected। मैं वास्तव में किसी भी अच्छे कारण के बारे में नहीं सोच सकता हूं कि आप एक नियंत्रक विधि क्यों बनाना चाहते हैं, publicसिवाय इसके कि आप या तो इसे सीधे या इसके माध्यम से कॉल करने में सक्षम होना चाहते हैंRenderAction
एरिक पेट्रोएलजे

@ एरिक: कुछ समय के लिए हमें गणना करने के लिए छोटे कोड लिखने की आवश्यकता होती है, इसलिए यदि यह नियंत्रक में सार्वजनिक है तो इसे url द्वारा एक्सेस किया जा सकता है, यदि आप नहीं चाहते हैं कि यह URL द्वारा बिल्कुल भी एक्सेस हो तो इसे [NonAction] के रूप में चिह्नित करें। ]
अली आद्रावी


8

पार्टी में थोड़ी देर, लेकिन ...

अन्य जवाब यह बताने का अच्छा काम करते हैं कि [ChildActionOnly]विशेषता का क्या प्रभाव पड़ता है। हालाँकि, ज्यादातर उदाहरणों में, मैं अपने आप से पूछता रहा कि मैं एक आंशिक दृश्य को प्रस्तुत करने के लिए एक नई कार्रवाई पद्धति क्यों बनाऊंगा, जब आप @Html.Partial("_MyParialView")सीधे दृश्य में सीधे प्रस्तुत कर सकते हैं। यह एक अनावश्यक परत की तरह लग रहा था। हालांकि, जैसा कि मैंने जांच की, मैंने पाया कि एक लाभ यह है कि बच्चे की कार्रवाई एक अलग मॉडल बना सकती है और आंशिक दृश्य को पारित कर सकती है। आंशिक के लिए आवश्यक मॉडल उस दृश्य के मॉडल में उपलब्ध नहीं हो सकता है जिसमें आंशिक दृश्य प्रदान किया जा रहा है। केवल आंशिक दृश्य को प्रस्तुत करने के लिए आवश्यक वस्तुओं / गुणों को प्राप्त करने के लिए मॉडल संरचना को संशोधित करने के बजाय, आप बच्चे को कार्रवाई कह सकते हैं और आंशिक दृश्य के लिए आवश्यक मॉडल बनाने के लिए एक्शन विधि का ध्यान रख सकते हैं।

यह काम में आ सकता है, उदाहरण के लिए, में _Layout.cshtml। यदि आपके पास सभी पृष्ठों के लिए कुछ गुण सामान्य हैं, तो इसे पूरा करने का एक तरीका आधार दृश्य मॉडल का उपयोग करना है और इसके पास अन्य सभी दृश्य मॉडल हैं। फिर, _Layoutबेस दृश्य मॉडल और सामान्य गुणों का उपयोग कर सकते हैं। नकारात्मक पक्ष (जो व्यक्तिपरक है) यह है कि सभी दृश्य मॉडल को यह देखने के लिए आधार दृश्य मॉडल से विरासत में प्राप्त करना चाहिए कि वे सामान्य गुण हमेशा उपलब्ध हैं। विकल्प @Html.Actionउन सामान्य स्थानों में प्रस्तुत करना है। क्रिया पद्धति आंशिक दृश्य के लिए सभी पृष्ठों के लिए आवश्यक एक अलग मॉडल बनाएगी, जो "मुख्य" दृश्य के लिए मॉडल को प्रभावित नहीं करेगी। इस विकल्प में, _Layoutपृष्ठ में एक मॉडल नहीं होना चाहिए। यह इस प्रकार है कि अन्य सभी व्यू मॉडल को किसी बेस व्यू मॉडल से विरासत में प्राप्त करने की आवश्यकता नहीं है।

मुझे यकीन है कि [ChildActionOnly]विशेषता का उपयोग करने के अन्य कारण हैं , लेकिन यह मुझे अच्छा लगता है, इसलिए मैंने सोचा कि मैं साझा करूंगा।


1
एक अन्य लाभ यह है कि यदि कोई आंशिक कॉल एक्शन कॉल में लिपटा है, तो हम इसमें कैश विशेषता जोड़ सकते हैं।
कर्मगाम

0
    public class HomeController : Controller  
    {  
        public ActionResult Index()  
        {  
            ViewBag.TempValue = "Index Action called at HomeController";  
            return View();  
        }  

        [ChildActionOnly]  
        public ActionResult ChildAction(string param)  
        {  
            ViewBag.Message = "Child Action called. " + param;  
            return View();  
        }  
    }  


The code is initially invoking an Index action that in turn returns two Index views and at the View level it calls the ChildAction named ChildAction”.

    @{
        ViewBag.Title = "Index";    
    }    
    <h2>    
        Index    
    </h2>  

    <!DOCTYPE html>    
    <html>    
    <head>    
        <title>Error</title>    
    </head>    
    <body>    
        <ul>  
            <li>    
                @ViewBag.TempValue    
            </li>    
            <li>@ViewBag.OnExceptionError</li>    
            @*<li>@{Html.RenderAction("ChildAction", new { param = "first" });}</li>@**@    
            @Html.Action("ChildAction", "Home", new { param = "first" })    
        </ul>    
    </body>    
    </html>  


      Copy and paste the code to see the result .thanks 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.