MVC'de ChildActionOnly Kullanımı


168

Bu özelliği ne zaman kullanırsınız ChildActionOnly? A ChildActionve hangi durumlarda bu özelliği kullanarak bir işlemi kısıtlamak istersiniz?

Yanıtlar:


161

Bu ChildActionOnlyözellik, bir eylem yönteminin yalnızca görünüm içinden alt yöntem olarak çağrılabilmesini sağlar. Bir eylem yönteminin bu özelliğin alt eylem olarak kullanılması gerekmez, ancak eylem yöntemlerinin bir kullanıcı isteği sonucunda çağrılmasını önlemek için bu özelliği kullanma eğilimindeyiz. Bir eylem yöntemi tanımladıktan sonra, eylem çağrıldığında oluşturulacak öğeleri oluşturmamız gerekir. Zorunlu olmasa da, çocuk eylemleri genellikle kısmi görüşlerle ilişkilidir.

  1. [ChildActionOnly], Görünüm'deki kod aracılığıyla kısıtlı erişime izin verir

  2. Belirli sayfa URL'si için Durum Bilgisi uygulaması. Örnek: Ödeme Sayfası URL'si (yalnızca bir kez ödeme) ustura sözdizimi, belirli işlemlerin koşullu olarak çağrılmasına olanak tanır


Görünümde örnek kullanım: <% Html.RenderAction ("MyChildAction", "MyController"); %>. Böylece GET ve yönlendirme ile bir çocuk eylemi çağıramazsınız
Erik Bergstedt

12
Örnek kod: @ Clark-Kent // 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." Böylece, belirli bir denetleyiciye bir GET'i doğrudan, ancak yalnızca başka bir denetleyici / eylem içinden engelleyebilirsiniz. Muhtemelen: _ Kısmi görünümler.
Langeleppel

1
InvalidOperationExceptionİşaretli bir Yöntemin <ChildActionOnly>tarayıcı aracılığıyla çağrılması en iyi nasıl yakalanır ?
Bernhard Döbler

@ Html.Action :) kullanmak zorunda kaldım
chris c

125

İle [ChildActionOnly] açıklamalı öznitelik, bir eylem yöntemi sadece bir görünüm içinde bir alt yöntemi olarak adlandırılabilir. İşte [ChildActionOnly] için bir örnek . .

iki eylem yöntemi vardır: Index () ve MyDateTime () ve karşılık gelen Görünümler: Index.cshtml ve MyDateTime.cshtml. bu 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 için görünüm .

@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>

İşte MyDateTime.cshtml kısmi görünümü.

@model DateTime

<p>
This is the child action result: @Model.ToLongTimeString()
<br />
@ViewBag.Message
</p>
 uygulamayı çalıştırır ve bu isteği yaparsanız http: // localhost: 57803 / home / mydatetime
 Sonuç şu şekilde Sunucu Hatası olacaktır :

resim açıklamasını buraya girin

Bu, kısmi görünümü doğrudan çağıramayacağınız anlamına gelir. ancak Index.cshtml'deki gibi Index () görünümünden çağrılabilir

     @ Html.Action ("MyDateTime") // Kısmi görünüm çağrılıyor: MyDateTime ().
 

[ChildActionOnly] öğesini kaldırır ve aynı isteği http: // localhost: 57803 / home / mydatetime yaparsanız, mydatetime kısmi görünüm sonucunu almanızı sağlar:
This is the child action result. 12:53:31 PM 
This is from MyDateTime()

Bence bu açıklama "tam durak", teşekkürler erkekler
TAHA SULTAN TEMURI

ama aynı NonActionzamanda, ne fark eder?
Imad

74

RenderActionGörünümlerinizden herhangi birini kullanıyorsanız , genellikle kısmi bir görünüm oluşturmak için kullanırsınız.

Bunu işaretlemenin nedeni, onu [ChildActionOnly]arayabilmeniz için denetleyici yönteminin genel olması gerektiğidir, RenderActionancak birisinin bir URL'ye (ör. / Denetleyici / SomeChildAction) gidip sonuçlarını görmesini istemezsiniz. doğrudan eylem.


2
[NonAction] 'a benzer. bu mu? fark ne o zaman?
DarthVader

10
@DarthVader - Benzer, ancak [NonAction] ile RenderActionher ikisini de kullanarak
arayamazsınız

@EricPetroelje: Eylem Yöntemi'ni NonActionAttributegerçek projelerde olduğu gibi işaretlemenin faydaları neler olabilir ?
wuhcwdc

1
@Pankaj - Dürüst olmak gerekirse, gerçekten iyi bir neden düşünemiyorum. Bir denetleyicideki bir yöntemin URL aracılığıyla erişilmesini istemiyorsanız, en iyi çözüm yöntemi privateveya yöntemini kullanmaktır protected. publicDoğrudan ya da doğrudan arayabilmek istiyorsanız, bir denetleyici yöntemi yapmak istemenizin iyi bir nedenini gerçekten düşünemiyorumRenderAction
Eric Petroelje 17:13

@Eric: bazen hesaplamak için küçük bir kod yazmamız gerekiyor, bu yüzden bu denetleyicide herkese açıksa, URL tarafından erişilebilir, eğer URL tarafından erişilmesini istemiyorsanız [NonAction] olarak işaretleyin ]
Ali Adravi


8

Partiye biraz geç ama ...

Diğer cevaplar, [ChildActionOnly]özelliğin ne gibi bir etkisi olduğunu açıklamak için iyi bir iş çıkarır . Bununla birlikte, çoğu örnekte, kendime neden yalnızca kısmi bir görünüm oluşturmak için başka bir görünümde, yalnızca@Html.Partial("_MyParialView") doğrudan görünümde . Gereksiz bir katman gibi görünüyordu. Ancak, araştırdığım gibi, bir faydasının çocuk eyleminin farklı bir model oluşturabileceğini ve bunu kısmi görüşe geçirebileceğini buldum. Kısmi için gereken model, kısmi görünümün oluşturulduğu görünüm modelinde mevcut olmayabilir. Sadece kısmi görünümü oluşturmak için gerekli nesneleri / özellikleri almak için model yapısını değiştirmek yerine, alt eylemi çağırabilir ve eylem yönteminin kısmi görünüm için gereken modeli oluşturmaya özen göstermesini sağlayabilirsiniz.

Bu, örneğin, içinde kullanışlı olabilir _Layout.cshtml. Tüm sayfalarda ortak olan birkaç özelliğiniz varsa, bunu gerçekleştirmenin bir yolu, temel görünüm modelini kullanmak ve diğer tüm görünüm modellerini miras almaktır. Sonra, _Layouttemel görünüm modelini ve ortak özelliklerini kullanabilir. Dezavantajı (öznel olan), tüm ortak özelliklerin her zaman kullanılabilir olmasını sağlamak için tüm görünüm modellerinin temel görünüm modelinden miras alması gerektiğidir. Alternatif, @Html.Actionbu ortak yerlerde render etmektir . İşlem yöntemi, tüm sayfalarda ortak olan kısmi görünüm için gerekli olan ve "ana" görünüm için modeli etkilemeyecek ayrı bir model oluşturur. Bu alternatifte, _Layoutsayfanın bir modeli olması gerekmez. Diğer tüm görünüm modellerinin herhangi bir taban görünüm modelinden miras alması gerekmediği sonucuna varılır.

[ChildActionOnly]Özelliğin kullanılmasının başka nedenleri olduğundan eminim , ama bu benim için iyi bir şey gibi görünüyor, bu yüzden paylaşacağımı düşündüm.


1
Başka bir avantaj, bir eylem çağrısında kısmi bir çağrı sarılmışsa, ona bir önbellek özelliği ekleyebiliriz.
kamgman

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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.