Использование ChildActionOnly в MVC

Когда вы используете атрибут ChildActionOnly ? Что такое ChildAction и в каком случае вы хотите ограничить действие, используя этот атрибут?

6 Solutions collect form web for “Использование ChildActionOnly в MVC”

ChildActionOnly гарантирует, что метод действия можно вызывать только как дочерний метод из представления. В методе действий не обязательно, чтобы этот атрибут использовался как дочернее действие, но мы склонны использовать этот атрибут, чтобы предотвратить использование методов действий в результате пользовательского запроса. Определив метод действия, нам нужно создать то, что будет отображаться при вызове действия. Действия ребенка обычно связаны с частичными представлениями, хотя это не является обязательным.

  1. [ChildActionOnly], разрешающий ограниченный доступ через код в представлении

  2. Реализация государственной информации для определенного URL-адреса страницы. Пример: URL-адрес платежной страницы (оплата только один раз). Синтаксис бритвы позволяет вызывать определенные действия условно

При annotations атрибута [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"; } 

Index

This is the index view for Home : @Model.ToLongTimeString()
@Html.Action("MyDateTime") // Calling the partial view: MyDateTime().
@ViewBag.Message

Вот частичный вид MyDateTime.cshtml .

 @model DateTime 

This is the child action result: @Model.ToLongTimeString()
@ViewBag.Message

  если вы запустите приложение и выполните этот запрос http: // localhost: 57803 / home / mydatetime
  Результатом будет Server Error : 

введите описание изображения здесь

Это означает, что вы не можете напрямую вызвать частичный вид. но его можно вызвать через представление Index (), как в Index.cshtml

      @ Html.Action («MyDateTime») // Вызов частичного представления: MyDateTime ().
 

  Если вы удалите [ChildActionOnly] и выполните тот же запрос http: // localhost: 57803 / home / mydatetime, вы можете получить результат частичного просмотра mydatetime: 
 This is the child action result. 12:53:31 PM This is from MyDateTime() 

Вы бы использовали его, если используете RenderAction в любом из своих представлений, обычно для частичного просмотра.

Причиной его маркировки с помощью [ChildActionOnly] является то, что вам нужен метод controllerа, чтобы вы могли его вызвать с помощью RenderAction но вы не хотите, чтобы кто-то мог перейти к URL-адресу (например, / Controller / SomeChildAction) и видеть результаты этого действия напрямую.

FYI, [ChildActionOnly] недоступен в ASP.NET MVC Core. см. информацию здесь

Немного поздно на вечеринку, но …

Другие ответы хорошо объясняют, что влияет на [ChildActionOnly] . Тем не менее, в большинстве примеров я постоянно спрашивал себя, почему я создаю новый метод действий только для частичного представления, в другом представлении, когда вы можете просто визуализировать @Html.Partial("_MyParialView") непосредственно в представлении. Это казалось ненужным слоем. Однако, по мере того, как я исследовал, я обнаружил, что одним преимуществом является то, что дочернее действие может создать другую модель и передать это частичному представлению. Модель, необходимая для частичного, может быть недоступна в модели представления, в котором производится частичное представление. Вместо того, чтобы модифицировать структуру модели, чтобы получить необходимые объекты / свойства, чтобы просто отобразить частичный вид, вы можете вызвать дочернее действие и применить метод действия для создания модели, необходимой для частичного представления.

Это может пригодиться, например, в _Layout.cshtml . Если у вас есть несколько свойств, общих для всех страниц, один из способов добиться этого – использовать базовую модель представления и унаследовать от нее все другие модели. Затем, _Layout может использовать базовую модель представления и общие свойства. Недостатком (что является субъективным) является то, что все модели представления должны наследоваться от модели базового представления, чтобы гарантировать, что эти общие свойства всегда доступны. Альтернативой является рендеринг @Html.Action в этих общих местах. Метод действия создаст отдельную модель, необходимую для частичного представления, общего для всех страниц, что не повлияет на модель для «основного» представления. В этой альтернативе страница _Layout не должна иметь модель. Из этого следует, что все другие модели представлений не должны наследоваться ни от одной модели базового представления.

Я уверен, что есть другие причины использовать [ChildActionOnly] , но для меня это кажется хорошим, поэтому я решил поделиться с [ChildActionOnly] .

  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"; } 

Index

< !DOCTYPE html> Error
  • @ViewBag.TempValue
  • @ViewBag.OnExceptionError
  • @*
  • @{Html.RenderAction("ChildAction", new { param = "first" });}
  • @**@ @Html.Action("ChildAction", "Home", new { param = "first" })
Copy and paste the code to see the result .thanks
  • OpenGL - вершинные нормали в OBJ
  • Как отменить односвязный список, используя только два указателя?
  • Импорт файлов CSV в .Net
  • XDocument или XmlDocument
  • Почему AppDomain.CurrentDomain.BaseDirectory не содержит «bin» в приложении asp.net?
  • Как сделать снимок экрана с помощью элемента управления WPF?
  • Для чего нужны аргументы main ()?
  • Ошибка при компиляции некоторого простого кода c ++
  • Эффективный способ хранения дерева Хаффмана
  • C # WinForms: как установить основную функцию STAThreadAttribute
  • Как перетащить UserControl внутри canvasа
  • Interesting Posts

    Configure предупреждает, что установленные библиотеки отсутствуют

    C ++ 11: массив времени компиляции с логарифмической глубиной оценки

    Как заблокировать раздражающие facebook и другие виджеты социальной сети

    Нужно ли включать логин для каждого использования?

    Миллионы 3D-точек: как найти 10 из них ближе всего к данной точке?

    Как получить текущий URL-адрес вкладки для расширения chrome?

    Ошибка скручивания сертификата при использовании RVM для установки Ruby 1.9.2

    jQuery datepicker – 2 ввода / текстовые поля и ограничивающий диапазон

    Variable Sized Struct C ++

    Windows 8.1 хочет отформатировать USB-накопитель с необычной, но допустимой схемой разбиения на GPT, почему?

    Android ListView не обновляется после notifyDataSetChanged

    Поймать все исключения в controllerе рельсов

    Может PackageManager.getInstallerPackageName () сказать мне, что мое приложение было установлено из магазина приложений Amazon?

    Издевательские методы локальных объектов области с Mockito

    Изменение текста кнопки onclick

    Давайте будем гением компьютера.