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

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

Ответ 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: 

enter image description here

Это означает, что вы не можете напрямую вызвать частичный вид. но он может быть вызван через представление 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