2012-04-20 9 views

उत्तर

135

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

  1. [ChildActionOnly] दृश्य में विशिष्ट पृष्ठ URL के लिए

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

+1

के रूप में चिह्नित करें, क्या आप इसे स्पष्ट करने के लिए कुछ कोड डाल सकते हैं कृप्या? –

+2

उत्तर अच्छा है। अगर आप कुछ कोड जोड़ते हैं तो यह बेहतर हो सकता है। – Garry

+0

उदाहरण एक दृश्य में उपयोग करें: <% Html.RenderAction ("MyChildAction", "MyController"); %>। इस प्रकार आप प्राप्त और –

67

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

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

+2

[NonAction] के समान। क्या यह? तब क्या अंतर है? – DarthVader

+9

@DarthVader - इसी प्रकार, लेकिन [NonAction] के साथ आप 'RenderAction' का उपयोग करके इसे कॉल करने में सक्षम नहीं होंगे –

+0

@EricPetroelje: वास्तविक परियोजनाओं में' NonActionAttribute' के रूप में कार्य विधि को चिह्नित करने के लाभ क्या हो सकते हैं? – wuhcwdc

96

[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> 
 if you run the application and do this request http://localhost:57803/home/mydatetime 
The result will be Server Error like so:

enter image description here

इसका मतलब है आप सीधे आंशिक दृश्य फोन नहीं कर सकते हैं। लेकिन यह() Index.cshtml

 
    @Html.Action("MyDateTime") // Calling the partial view: MyDateTime(). 

If you remove [ChildActionOnly] and do the same request http://localhost:57803/home/mydatetime it allows you to get the mydatetime partial view result:
This is the child action result. 12:53:31 PM 
This is from MyDateTime() 
+1

बहुत वर्णनात्मक – Red

+7

धन्यवाद, स्वीकृत उत्तर से बेहतर स्पष्टीकरण – joym8

3

एक छोटी सी पार्टी के लिए देर में के रूप में देखने के सूचकांक के माध्यम से कहा जा सकता है, लेकिन ...

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

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

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

5

एफवाईआई, [चाइल्डएक्शनऑनली] एएसपी.नेट एमवीसी कोर में उपलब्ध नहीं है। कुछ जानकारी देखें here

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 
संबंधित मुद्दे