Когда вы используете атрибут ChildActionOnly
? Что такое ChildAction
и в каких обстоятельствах вы хотите ограничить действие с помощью этого атрибута?
Использование ChildActionOnly в MVC
Ответ 1
Атрибут ChildActionOnly
гарантирует, что метод действия можно вызывать только как дочерний метод
изнутри представления. Метод действия не должен иметь этот атрибут для использования в качестве дочернего действия, но
мы склонны использовать этот атрибут для предотвращения вызова методов действий в результате использования пользователем
запрос.
Определив метод действия, нам нужно создать то, что будет отображаться, когда действие
вызывается. Действия ребенка обычно связаны с частичными представлениями, хотя это не является обязательным.
-
[ChildActionOnly], разрешающий ограниченный доступ через код в представлении
-
Реализация государственной информации для конкретного URL-адреса страницы. Пример: URL-адрес платежной страницы (оплата только один раз) синтаксис бритвы позволяет вызывать определенные действия условно
Ответ 2
При аннотации атрибута [ChildActionOnly] метод действия может быть вызван только как дочерний метод из представления. Ниже приведен пример для [ChildActionOnly]..
Существует два метода действий: Index() и MyDateTime() и соответствующие Views: 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:
Это означает, что вы не можете напрямую вызвать частичный вид. но он может быть вызван через представление Index(), как в 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()
Ответ 3
Вы использовали бы это, если используете RenderAction
в любом из ваших представлений, обычно для частичного просмотра.
Причиной маркировки с помощью [ChildActionOnly]
является то, что вам необходим метод контроллера, чтобы вы могли его вызвать с помощью RenderAction
, но вы не хотите, чтобы кто-то мог перейти к URL-адресу (например,/Controller/SomeChildAction) и непосредственно увидеть результаты этого действия.
Ответ 4
FYI, [ChildActionOnly] недоступен в ASP.NET MVC Core. см. информацию здесь
Ответ 5
Немного поздно на вечеринку, но...
Другие ответы хорошо объясняют, какой эффект имеет атрибут [ChildActionOnly]
. Тем не менее, в большинстве примеров я постоянно спрашивал себя, почему я создаю новый метод действий, чтобы отобразить частичное представление в другом представлении, когда вы могли просто отобразить @Html.Partial("_MyParialView")
непосредственно в представлении. Это казалось ненужным слоем. Однако, по мере того, как я исследовал, я обнаружил, что одним преимуществом является то, что дочернее действие может создать другую модель и передать это частичному представлению. Модель, необходимая для частичного, может быть недоступна в модели представления, в котором производится частичное представление. Вместо того, чтобы модифицировать структуру модели, чтобы получить необходимые объекты/свойства, чтобы просто отобразить частичный вид, вы можете вызвать дочернее действие и заставить метод действия заботиться о создании модели, необходимой для частичного представления.
Это может пригодиться, например, в _Layout.cshtml
. Если у вас есть несколько свойств, общих для всех страниц, один из способов добиться этого - использовать базовую модель представления и унаследовать от нее все другие модели. Затем _Layout
может использовать модель базового представления и общие свойства. Недостатком (что является субъективным) является то, что все модели представления должны наследоваться от модели базового представления, чтобы гарантировать, что эти общие свойства всегда доступны. Альтернативой является рендеринг @Html.Action
в этих общих местах. Метод действия создаст отдельную модель, необходимую для частичного представления, общего для всех страниц, что не повлияет на модель для "основного" представления. В этой альтернативе страница _Layout
не должна иметь модель. Из этого следует, что все другие модели представлений не должны наследоваться ни от одной модели базового представления.
Я уверен, что есть другие причины использовать атрибут [ChildActionOnly]
, но для меня это кажется хорошим, поэтому я решил поделиться с ним.
Ответ 6
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