Использование coredotnet Razor Pages, как загрузить частичное представление через ajax

При использовании страниц Razor просто использовать частичное использование @Html.Partial(..). Однако, когда раскрывающийся список изменяется, я хочу обновить часть представления - часть, отображаемую частичным представлением.

Я искал много и нашел ответы, такие как: https://github.com/aspnet/Razor/issues/2073, где говорят, что частичные файлы предназначены для кода.

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


person Simon    schedule 11.07.2018    source источник
comment
ты пользуешься какой-нибудь библиотекой? например jquery или angular? можно настроить что-то вроде помощника по тегам. я делал это с angular раньше   -  person Neville Nazerane    schedule 11.07.2018
comment
Нет, изучение чистых бритвенных страниц в dotnet core v2.1   -  person Simon    schedule 12.07.2018
comment
ну, ajax - это концепция js (клиент + сервер), которая больше не является чистой бритвой (на стороне сервера). Я искал что-то встроенное в бритву через js, но ничего не нашел. Поэтому, если вам нужно выполнить повторный рендеринг, вам придется использовать js в той или иной форме.   -  person Neville Nazerane    schedule 12.07.2018
comment
при каких событиях вам нужно повторно рендерить представление? у вас есть варианты использования?   -  person Neville Nazerane    schedule 12.07.2018
comment
Думаю, сценарий прост. У меня есть выпадающий список со списком отделов. Когда раскрывающийся список изменится, я хочу загрузить новый набор модулей, относящихся к новому отделу. Я мог бы перезагрузить всю страницу и использовать ту же логику, что и при ее первом рендеринге, но просто замена рассматриваемого раздела кажется лучше.   -  person Simon    schedule 13.07.2018
comment
Обнаружение раскрывающегося списка будет событием dom, которое легко превратится в js. Если вы ищете что-то встроенное / оригинальное, Microsoft уже много лет назад разрабатывала что-то для аналогичного использования. github.com/aspnet/jquery-ajax-unobtrusive Однако ms больше не поддерживает для этого, поскольку все переходят к библиотекам js для таких функций обновления ajax.   -  person Neville Nazerane    schedule 13.07.2018
comment
Я очень рад использовать Ajax / Jquery, это не проблема, просто нужно ли нам вернуться к MVC для этого рендеринга с частичной загрузкой или мы можем продолжать использовать Razor Pages и каким-то образом добиться этого, хотя это   -  person Simon    schedule 13.07.2018
comment
относительно использования бритвы, проверьте мой комментарий к ответу Брайана. Обычно ваше представление должно быть доступно как URL. Это означает, что вам нужно подумать о заменах, если вы передаете свою модель через @Html.Partial(...). Например, вы можете взять идентификатор в качестве параметра URL-адреса и получить данные   -  person Neville Nazerane    schedule 13.07.2018
comment
чтобы создать для этого страницу бритвы, просто создайте страницу и убедитесь, что вы установили макет на нуль   -  person Neville Nazerane    schedule 13.07.2018


Ответы (1)


Да,

Имейте метод действия, который можно вызвать для перезагрузки только частичного представления:

public ActionResult Reload()
{
    return PartialView("NameOfPartialView");
}

Получите от клиента (я буду использовать jQuery):

$.ajax({ 
  type: "post", 
  url: "Reload",
  data: {},
  success: function(d) {
   //d is the HTML content returned from the Action Method
   $("#parentelementaroundinnerdata").html(d);
  }
});

Возврат частичного представления из метода действия возвращает строку HTML, которую можно вставить на страницу с помощью родительского элемента для замены его содержимого обновлением. Это означает, что при рендеринге оригинала необходимо настроить следующие параметры:

<div id="parentelementaroundinnerdata">
   @Html.Partial("NameOfPartialView")
</div>

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

person Brian Mains    schedule 11.07.2018
comment
Это работает с Razor Pages? это похоже на стандартный MVC, или нужно путать между ними обоими? - person Simon; 12.07.2018
comment
таким образом требуется, чтобы ваше частичное представление было доступно через URL-адрес. показанный здесь контроллер просто проверяет наличие URL-адреса. вы также можете сделать вид бритвы с макетом, установленным на null, который может действовать как ваш частичный вид - person Neville Nazerane; 12.07.2018
comment
Что ж, запрос AJAX обращается к методу действия, тогда как Html.Partial не беспокоится о загрузке чего-либо из метода действия. Единственная причина, по которой он отображается, заключается в том, что он перезагружает частичное представление, а не запускается из исходного выполнения представления. Я обновил образец выше. Что касается макета, я никогда не указываю для атрибута макета значение null, и никакая страница макета никогда не появляется с частичным объявлением. Это замечательно, потому что теоретически вы можете определить одно и то же представление как в режиме просмотра, так и в режиме частичного просмотра, но это действительно сложно. - person Brian Mains; 13.07.2018
comment
Так что я все еще не уверен во всем этом, что касается элемента MVC vs Razor Pages. В Razor Pages это будет общедоступный IActionResult OnGetReload (), а PartialView недоступен в качестве возвращаемого типа. Так что, по-видимому, нужно где-то ссылаться на другую dll MVC. Так что не до сути дела - Razor Pages - person Simon; 13.07.2018
comment
Извините, я не осознал этого различия, но будет ли это решение (внизу) работать: github .com / aspnet / Mvc / issues / 6759. - person Brian Mains; 13.07.2018