এমভিসিতে চাইল্ডএ্যাকশনঅনলি ব্যবহার করা হচ্ছে


168

আপনি কখন অ্যাট্রিবিউটটি ব্যবহার করবেন ChildActionOnly? কোনটি ChildActionএবং কোন পরিস্থিতিতে আপনি এই বৈশিষ্ট্যটি ব্যবহার করে কোনও ক্রিয়া সীমাবদ্ধ রাখতে চান?

উত্তর:


161

ChildActionOnlyঅ্যাট্রিবিউট নিশ্চিত করে যে একটি কর্ম পদ্ধতি একটি দৃশ্য মধ্যে থেকে মাত্র একটি শিশু পদ্ধতি হিসাবে বলা যায় না। একটি ক্রিয়া পদ্ধতিতে শিশু অ্যাকশন হিসাবে এই বৈশিষ্ট্যটি ব্যবহার করার দরকার নেই তবে ব্যবহারকারীর অনুরোধের ফলে ক্রিয়া পদ্ধতিগুলি রোধ করতে আমরা এই বৈশিষ্ট্যটি ব্যবহার করার প্রবণতা রাখি। একটি ক্রিয়া পদ্ধতি সংজ্ঞায়িত করার পরে, ক্রিয়াটি শুরু করা হলে আমাদের কী রেন্ডার হবে তা তৈরি করতে হবে। শিশু ক্রিয়াগুলি সাধারণত আংশিক দর্শনের সাথে যুক্ত হয় যদিও এটি বাধ্যতামূলক নয়।

  1. [চাইল্ড অ্যাকশনঅনলি] ভিউ-তে কোডের মাধ্যমে সীমাবদ্ধ অ্যাক্সেসের অনুমতি দেওয়া হচ্ছে

  2. নির্দিষ্ট পৃষ্ঠা URL এর জন্য রাজ্য তথ্য বাস্তবায়ন। উদাহরণ: পেমেন্ট পেজ ইউআরএল (কেবল একবার পরিশোধ করা) রেজার সিনট্যাক্স নির্দিষ্ট ক্রিয়াকে শর্তযুক্ত কল করতে দেয়


একটি দৃশ্যে ব্যবহারের উদাহরণ: <% Html.RenderAction ("MyChildAction", "MyController"); %>। সুতরাং আপনি জিইটি এবং রাউটিংয়ের সাথে কোনও শিশু ক্রিয়াকে কল করতে পারবেন না
এরিক বার্গস্টেট

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." তাই আপনি কোনও নির্দিষ্ট নিয়ামকের কাছে সরাসরি জিইটি প্রতিরোধ করেন তবে কেবলমাত্র অন্য নিয়ামক / ক্রিয়া থেকে। সম্ভবত :_পরিষদ দেখা।
লাঙ্গলেপেল

1
ব্রাউজারের মাধ্যমে InvalidOperationExceptionচিহ্নিত পদ্ধতিটিকে যখন <ChildActionOnly>ডাকা হয় তখন কীভাবে সেরা ধরা যায় ?
বার্নহার্ড ডাবলার

আমাকে @ এইচটিএমএল.অ্যাকশন :) ব্যবহার করতে হয়েছিল
ক্রিস সি

125

সঙ্গে [ChildActionOnly] অ্যাট্রিবিউট সটীক, একটি কর্ম পদ্ধতি শুধুমাত্র একটি দৃশ্য মধ্যে থেকে একটি শিশু পদ্ধতি হিসাবে বলা যায় না। এখানে [চাইল্ড অ্যাকশনঅনলি] এর একটি উদাহরণ

দুটি ক্রিয়াকলাপ রয়েছে: সূচি () এবং মাইডেটটাইম () এবং এর সাথে সম্পর্কিত দর্শনগুলি: সূচিপত্র শ্যাশটিএমএল এবং মাইডেটটাইম.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: // লোকালহোস্ট: 57803 / হোম / মাইডেটটাইম করেন
 ফলাফলটি এর মতো সার্ভার ত্রুটি হবে :

এখানে চিত্র বর্ণনা লিখুন

এর অর্থ আপনি সরাসরি আংশিক দৃশ্য কল করতে পারবেন না। তবে সূচক () ভিউয়ের মাধ্যমে এটি সূচী সূচক হিসাবে বলা যেতে পারে sh

     @ এইচটিএমএল.এ্যাকশন ("মাইডেটটাইম") // আংশিক দৃশ্য কল করা হচ্ছে: মাইডেটটাইম ()।
 

যদি আপনি [চাইল্ড অ্যাকশনআলি] অপসারণ করেন এবং একই অনুরোধটি করুন: http: // লোকালহোস্ট: 57803 / হোম / মাইডেটটাইম এটি আপনাকে মাইডেটটাইম আংশিক দেখার ফলাফল পেতে দেয়:
This is the child action result. 12:53:31 PM 
This is from MyDateTime()

আমি মনে করি এই ব্যাখ্যাটি "ফুল স্টপ" ছিল, পুরুষদের ধন্যবাদ
থাহা সুলতান তেমুরি ২I

তবে এটি ব্যবহার NonActionকরেও অর্জন করা যেতে পারে , এতে কী তফাত আসে?
ইমাদ

74

আপনি যদি আপনার RenderActionকোনও দৃশ্যে সাধারণত আংশিক দৃশ্য রেন্ডার করতে ব্যবহার করেন তবে আপনি এটি ব্যবহার করবেন ।

এটির সাথে চিহ্নিত করার কারণ [ChildActionOnly]হ'ল আপনার কন্ট্রোলার পদ্ধতিটি জনসাধারণের জন্য প্রয়োজন যাতে আপনি এটির সাথে কল করতে পারেন RenderActionতবে আপনি চান না যে কেউ কোনও ইউআরএল (যেমন / নিয়ন্ত্রণকারী / সামারচিল্ড অ্যাকশন) এ নেভিগেট করতে সক্ষম হন এবং এর ফলাফলগুলি দেখুন that সরাসরি পদক্ষেপ।


2
[ননএকশন] এর অনুরূপ। তাই কি? তাহলে কি পার্থক্য?
ডার্থভেডার

10
@DarthVader - অনুরূপ, কিন্তু [NonAction] এর সাথে তুমি কি ব্যবহার করে এটিকে কল করতে সক্ষম হবে RenderActionপারেন
এরিক Petroelje

@ এরিকপেট্রোলেজে: NonActionAttributeবাস্তব প্রকল্পগুলির মতো অ্যাকশন পদ্ধতি চিহ্নিত করার সুবিধা কী হতে পারে ?
wuhcwdc

1
@ পঙ্কজ - সত্য, আমি কোনও সত্যিকারের ভাল কারণ সম্পর্কে ভাবতে পারি না। আপনি যদি কোনও কন্ট্রোলারের কোনও পদ্ধতিতে ইউআরএল মাধ্যমে অ্যাক্সেস না চান তবে সেরা সমাধানটি কেবল পদ্ধতিটি তৈরি করা privateবা protectedpublicআপনি যদি নিয়ন্ত্রক পদ্ধতি তৈরি করতে চান তবে আপনি সরাসরি বা মাধ্যমে সরাসরি কল করতে সক্ষম হতে চাইলে কোনও সত্য কারণ আমি সত্যিই ভাবতে পারি নাRenderAction
এরিক পেট্রোলেজে

@ এরিক: কিছু সময় আমাদের গণনার জন্য ছোট কোড লিখতে হবে, সুতরাং এটি যদি নিয়ামক হিসাবে প্রকাশ্য হয় তবে এটি ইউআরএল দ্বারা অ্যাক্সেস করা যেতে পারে, আপনি যদি এটি ইউআরএল দ্বারা অ্যাক্সেস পেতে চান না তবে এটিকে [অ্যাকশন হিসাবে চিহ্নিত করুন ]
আলী আদ্রবী

10

এফওয়াইআই, [চাইল্ড অ্যাকশন কেবল] এএসপি.নেট এমভিসি কোরে উপলভ্য নয়। এখানে কিছু তথ্য দেখুন


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 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.