आप विशेषता का उपयोग कब करेंगे ChildActionOnly
? क्या है ChildAction
और इस परिस्थिति में आप इस विशेषता का उपयोग करके किसी कार्रवाई को कैसे प्रतिबंधित करना चाहते हैं?
आप विशेषता का उपयोग कब करेंगे ChildActionOnly
? क्या है ChildAction
और इस परिस्थिति में आप इस विशेषता का उपयोग करके किसी कार्रवाई को कैसे प्रतिबंधित करना चाहते हैं?
जवाबों:
ChildActionOnly
विशेषता यह सुनिश्चित करता है कि एक कार्रवाई विधि एक दृश्य के भीतर से ही एक बच्चे के तरीके के रूप में कहा जा सकता है। एक एक्शन मेथड को इस एक्टिविटी को चाइल्ड एक्शन के रूप में इस्तेमाल करने की आवश्यकता नहीं है, लेकिन हम एक्शन विधियों को यूजर रिक्वेस्ट के परिणामस्वरूप मंगवाने से रोकने के लिए इस विशेषता का उपयोग करते हैं। एक एक्शन विधि को परिभाषित करने के बाद, हमें यह बनाने की आवश्यकता है कि एक्शन लागू होने पर क्या प्रदान किया जाएगा। बाल क्रियाएं आम तौर पर आंशिक विचारों से जुड़ी होती हैं, हालांकि यह अनिवार्य नहीं है।
[ChildActionOnly] दृश्य में कोड के माध्यम से प्रतिबंधित पहुंच की अनुमति
विशिष्ट पृष्ठ URL के लिए राज्य सूचना कार्यान्वयन। उदाहरण: भुगतान पृष्ठ URL (केवल एक बार भुगतान) रेजर सिंटैक्स विशिष्ट कार्यों को सशर्त कॉल करने की अनुमति देता है
// 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 को रोकते हैं, लेकिन केवल किसी अन्य नियंत्रक / कार्रवाई के भीतर से। पसंद: _पार्टियल विचार।
InvalidOperationException
जब <ChildActionOnly>
ब्राउज़र के माध्यम से एक विधि को चिह्नित किया जाता है , तो सबसे अच्छा कैसे पकड़ें ?
साथ [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()
NonAction
भी प्राप्त किया जा सकता है , इससे क्या फर्क पड़ता है?
यदि आप RenderAction
अपने किसी भी दृष्टिकोण में उपयोग कर रहे हैं , तो आमतौर पर आंशिक दृश्य प्रस्तुत करने के लिए आप इसका उपयोग करेंगे ।
इसके साथ चिन्हित करने का कारण यह [ChildActionOnly]
है कि आपको सार्वजनिक होने के लिए नियंत्रक विधि की आवश्यकता है ताकि आप इसे कॉल कर सकें, RenderAction
लेकिन आप नहीं चाहते कि कोई व्यक्ति URL पर नेविगेट करने में सक्षम हो (जैसे / नियंत्रक / SomeChildAction) और उसके परिणाम देखें सीधे कार्रवाई।
RenderAction
या तो
NonActionAttribute
असली प्रोजेक्ट्स की तरह एक्शन विधि को चिह्नित करने के क्या लाभ हो सकते हैं ?
private
या protected
। मैं वास्तव में किसी भी अच्छे कारण के बारे में नहीं सोच सकता हूं कि आप एक नियंत्रक विधि क्यों बनाना चाहते हैं, public
सिवाय इसके कि आप या तो इसे सीधे या इसके माध्यम से कॉल करने में सक्षम होना चाहते हैंRenderAction
पार्टी में थोड़ी देर, लेकिन ...
अन्य जवाब यह बताने का अच्छा काम करते हैं कि [ChildActionOnly]
विशेषता का क्या प्रभाव पड़ता है। हालाँकि, ज्यादातर उदाहरणों में, मैं अपने आप से पूछता रहा कि मैं एक आंशिक दृश्य को प्रस्तुत करने के लिए एक नई कार्रवाई पद्धति क्यों बनाऊंगा, जब आप @Html.Partial("_MyParialView")
सीधे दृश्य में सीधे प्रस्तुत कर सकते हैं। यह एक अनावश्यक परत की तरह लग रहा था। हालांकि, जैसा कि मैंने जांच की, मैंने पाया कि एक लाभ यह है कि बच्चे की कार्रवाई एक अलग मॉडल बना सकती है और आंशिक दृश्य को पारित कर सकती है। आंशिक के लिए आवश्यक मॉडल उस दृश्य के मॉडल में उपलब्ध नहीं हो सकता है जिसमें आंशिक दृश्य प्रदान किया जा रहा है। केवल आंशिक दृश्य को प्रस्तुत करने के लिए आवश्यक वस्तुओं / गुणों को प्राप्त करने के लिए मॉडल संरचना को संशोधित करने के बजाय, आप बच्चे को कार्रवाई कह सकते हैं और आंशिक दृश्य के लिए आवश्यक मॉडल बनाने के लिए एक्शन विधि का ध्यान रख सकते हैं।
यह काम में आ सकता है, उदाहरण के लिए, में _Layout.cshtml
। यदि आपके पास सभी पृष्ठों के लिए कुछ गुण सामान्य हैं, तो इसे पूरा करने का एक तरीका आधार दृश्य मॉडल का उपयोग करना है और इसके पास अन्य सभी दृश्य मॉडल हैं। फिर, _Layout
बेस दृश्य मॉडल और सामान्य गुणों का उपयोग कर सकते हैं। नकारात्मक पक्ष (जो व्यक्तिपरक है) यह है कि सभी दृश्य मॉडल को यह देखने के लिए आधार दृश्य मॉडल से विरासत में प्राप्त करना चाहिए कि वे सामान्य गुण हमेशा उपलब्ध हैं। विकल्प @Html.Action
उन सामान्य स्थानों में प्रस्तुत करना है। क्रिया पद्धति आंशिक दृश्य के लिए सभी पृष्ठों के लिए आवश्यक एक अलग मॉडल बनाएगी, जो "मुख्य" दृश्य के लिए मॉडल को प्रभावित नहीं करेगी। इस विकल्प में, _Layout
पृष्ठ में एक मॉडल नहीं होना चाहिए। यह इस प्रकार है कि अन्य सभी व्यू मॉडल को किसी बेस व्यू मॉडल से विरासत में प्राप्त करने की आवश्यकता नहीं है।
मुझे यकीन है कि [ChildActionOnly]
विशेषता का उपयोग करने के अन्य कारण हैं , लेकिन यह मुझे अच्छा लगता है, इसलिए मैंने सोचा कि मैं साझा करूंगा।
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