дія контролера часткового перегляду asp.net MVC


78

Я дуже новачок у розробці веб-додатків, і я думав, що почну з останніх технологій, тому намагаюся одразу вивчити asp.net, а також структуру MVC. Це, мабуть, дуже просте запитання для вас, професіоналів MVC.

Моє запитання полягає в тому, чи повинен частковий вигляд мати пов'язану з ним дію, і якщо так, чи викликається ця дія щоразу, коли звичайна сторінка використовує RenderPartial()для часткового подання?

Відповіді:


138

Хоча ви можете мати дію, яка повертає частковий вигляд, вам не потрібна дія, щоб відтворити частковий вигляд. RenderPartial робить частковий вигляд і відображає його, використовуючи дану модель та дані перегляду, якщо вони надані, у поточний (батьківський) вигляд.

Можливо, вам потрібна дія, яка повертає частковий вигляд, якщо ви використовуєте AJAX для завантаження / перезавантаження частини сторінки. У цьому випадку повернення повного перегляду не бажано, оскільки потрібно лише перезавантажити частину сторінки. У цьому випадку ви можете отримати дію просто повернути частковий вигляд, який відповідає цьому розділу сторінки.

Стандартний механізм

Використання часткового перегляду в межах звичайного перегляду (ніяких дій не потрібно)

...some html...
<% Html.RenderPartial( "Partial", Model.PartialModel ); %>
...more html..

Механізм Аякса

Перезавантаження частини сторінки за допомогою AJAX (часткова примітка відображається вбудованою при початковому завантаженні сторінки)

...some html...
<div id="partial">
<% Html.RenderPartial( "Partial", Model.PartialModel ); %>
</div>
...more html...

<script type="text/javascript">
   $(function() {
       $('#someButton').click( function() {
           $.ajax({
              url: '/controller/action',
              data: ...some data for action...,
              dataType: 'html',
              success: function(data) {
                 $('#partial').html(data);
              },
              ...
           });
       });
   });
</script>

Контролер для AJAX

public ActionResult Action(...)
{
     var model = ...

     ...

     if (Request.IsAjaxRequest())
     {
          return PartialView( "Partial", model.PartialModel );
     }
     else
     {
          return View( model );
     }
}

Я бачу, я просто граюся із шаблоном VS для програми MVC. Я намагаюся відобразити кілька списків клієнтів, наприклад, у частковому поданні. На даний момент у мене є клас моделі передачі даних, як би я надіслав цю модель у частковий вигляд, не залучаючи перегляд сторінки, який робить цей частковий вигляд? Спасибі за вашу допомогу!
yogibear

1
Часткове завжди включається в основний вид. Єдиний раз, коли ви могли б повернути часткову інформацію самостійно, було б, якщо ви оновлювались через AJAX. Імовірно ви використовували б частково , щоб відобразити в список клієнтів. Можливо, ви могли б використовувати цикл foreach у своєму поданні для перегляду списків (що містяться в моделі подання), передаючи кожен із них частковому як свою модель.
tvanfosson 03

Вау дуже вичерпна відповідь, спасибі tvanfosson!
yogibear

Одна порада - використовувати Url.Action, оскільки жорстке кодування такого шляху порушить програму при зміні маршруту або зміні структури карти.
Jean-Paul

3

Прийнята відповідь є абсолютно правильною, але я хочу додати, що ви можете завантажити свій частковий вигляд, використовуючи jQuery load. Потрібна менша конфігурація, якщо ви не хочете розглядати паралельність.

$("#Your-Container").load("/controller/action/id");

1
Одна порада - використовувати Url.Action, оскільки жорстке кодування такого шляху порушить програму при зміні маршруту або зміні структури карти.
Jean-Paul

Повністю згоден з вами @JpHouten.
Саїд

2

Відповідь - ні. Але іноді вам потрібні деякі дії контролера за частковим видом. Тоді ви можете створити actionMethod, який повертає частковий вигляд. Цей actionMethod можна викликати в іншому поданні:

@Html.Action("StockWarningsPartial", "Stores")

Метод дії може виглядати так:

public ActionResult StockWarningsPartial()
{
      ....              
      return View("StockWarningsPartial", warnings);

}

а подання 'StockWarningsPartial.cshtml' починається з:

@{
    Layout = null;
}

щоб знов не відображати навколишній макет.


2

Я зміг досягти чогось подібного за допомогою цієї логіки.

У межах .cshtml

@Html.Action("ActionMethodName", "ControllerName");

Всередині контролера

[Route("some-action")]
public ActionResult ActionMethodName()
{
    var someModel = new SomeModel();
    ...
    return PartialView("SomeView.cshtml", someModel);
}

І це все.

Якщо вам потрібно передати значення з .cshtml методу дії, це можливо.


1
Ідеальний приклад. Ви продемонстрували взаємодію та код як у контролері, так і в поданні чітко і чітко прямо в точці. Без пуху. Дякую.
eaglei22
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.