Bu özelliği ne zaman kullanırsınız ChildActionOnly
? A ChildAction
ve hangi durumlarda bu özelliği kullanarak bir işlemi kısıtlamak istersiniz?
Bu özelliği ne zaman kullanırsınız ChildActionOnly
? A ChildAction
ve hangi durumlarda bu özelliği kullanarak bir işlemi kısıtlamak istersiniz?
Yanıtlar:
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.
[ChildActionOnly], Görünüm'deki kod aracılığıyla kısıtlı erişime izin verir
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
// 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.
InvalidOperationException
İşaretli bir Yöntemin <ChildActionOnly>
tarayıcı aracılığıyla çağrılması en iyi nasıl yakalanır ?
İ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 :
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()
NonAction
zamanda, ne fark eder?
RenderAction
Gö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, RenderAction
ancak birisinin bir URL'ye (ör. / Denetleyici / SomeChildAction) gidip sonuçlarını görmesini istemezsiniz. doğrudan eylem.
RenderAction
her ikisini de kullanarak
NonActionAttribute
gerçek projelerde olduğu gibi işaretlemenin faydaları neler olabilir ?
private
veya yöntemini kullanmaktır protected
. public
Doğrudan ya da doğrudan arayabilmek istiyorsanız, bir denetleyici yöntemi yapmak istemenizin iyi bir nedenini gerçekten düşünemiyorumRenderAction
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, _Layout
temel 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.Action
bu 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, _Layout
sayfanı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.
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