Когда бы вы использовали атрибут 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]. ,
Есть два метода действия: Index () и MyDateTime () и соответствующие Views: Index.cshtml и MyDateTime.cshtml. это HomeController.cs
Вот представление для Index.cshtml .
Вот MyDateTime.cshtml частичное представление.
Это означает, что вы не можете напрямую вызвать частичное представление. но он может быть вызван через представление Index (), как в Index.cshtml
источник
NonAction
также, какая разница?Вы бы использовали его, если вы используете
RenderAction
в любом из ваших представлений, обычно для визуализации частичного представления.Причина, по которой он помечен,
[ChildActionOnly]
заключается в том, что вам нужно, чтобы метод контроллера был общедоступным, чтобы вы могли вызывать его с помощью,RenderAction
но вы не хотите, чтобы кто-то мог переходить по URL (например, / Controller / SomeChildAction) и видеть результаты этого. действие напрямую.источник
RenderAction
либоNonActionAttribute
в реальных проектах?private
илиprotected
. Я не могу придумать какой-либо веской причины, по которой вы хотели бы создать метод контроллера,public
за исключением случаев, когда вы хотели бы иметь возможность вызывать его напрямую или черезRenderAction
К вашему сведению, [ChildActionOnly] недоступно в ASP.NET MVC Core. см. некоторую информацию здесь
источник
Немного опоздал на вечеринку, но ...
Другие ответы хорошо объясняют, какой эффект
[ChildActionOnly]
имеет атрибут. Тем не менее, в большинстве примеров я продолжал спрашивать себя, зачем создавать новый метод действия только для визуализации частичного представления в другом представлении, когда вы можете просто выполнить визуализацию@Html.Partial("_MyParialView")
непосредственно в представлении. Это казалось ненужным слоем. Однако, как я выяснил, я обнаружил, что одним из преимуществ является то, что дочернее действие может создать другую модель и передать ее в частичное представление. Модель, необходимая для частичного представления, может быть недоступна в модели представления, в котором отображается частичное представление. Вместо того, чтобы изменять структуру модели, чтобы получить необходимые объекты / свойства для визуализации частичного представления, вы можете вызвать дочернее действие, а метод действия позаботится о создании модели, необходимой для частичного представления.Это может пригодиться, например, в
_Layout.cshtml
. Если у вас есть несколько свойств, общих для всех страниц, один из способов сделать это - использовать базовую модель представления и наследовать от нее все другие модели представления. Затем_Layout
можно использовать модель базового вида и общие свойства. Недостатком (который является субъективным) является то, что все модели представлений должны наследоваться от модели базовых представлений, чтобы гарантировать, что эти общие свойства всегда доступны. Альтернатива состоит в том, чтобы сделать@Html.Action
в этих общих местах. Метод действия создаст отдельную модель, необходимую для частичного представления, общего для всех страниц, что не повлияет на модель для «основного» представления. В этой альтернативе_Layout
странице не нужно иметь модель. Отсюда следует, что все другие модели представлений не должны наследоваться от какой-либо базовой модели представлений.Я уверен, что есть и другие причины для использования
[ChildActionOnly]
атрибута, но мне он кажется хорошим, поэтому я решил поделиться.источник
источник