Отрисовка частичного представления с помощью jQuery в ASP.NET MVC

Как визуализировать частичное представление с помощью jquery?

Мы можем визуализировать частичный вид следующим образом:

<% Html.RenderPartial("UserDetails"); %>

Как мы можем сделать то же самое с помощью jquery?


person Prasad    schedule 15.10.2009    source источник
comment
Вы также можете посмотреть статью ниже. tugberkugurlu.com/archive/ Он использует другой подход и улучшает его.   -  person tugberk    schedule 10.09.2011
comment
Глупый вопрос. Является ли UserDetails частичным представлением в виде страницы cshtml: UserDetails.cshtml? Я пытаюсь загрузить частичное представление. И обычно я бы использовал: @ Html.Partial (~ / Views / PartialViews / FirstPartialViewTwo.cshtml)   -  person George Geschwend    schedule 04.01.2018
comment
@GeorgeGeschwend, здесь нет ничего глупого, пока кто-то не сможет на это ответить. UserDetails (UserDetails.cshtml) - это частичное представление внутри пользовательского контроллера. Как и в комментариях к отмеченному ответу, лучше использовать Url.Action вместо жесткого кодирования полного пути представления.   -  person Prasad    schedule 11.01.2018


Ответы (8)


Вы не можете визуализировать частичное представление, используя только jQuery. Однако вы можете вызвать метод (действие), который будет отображать частичное представление для вас и добавить его на страницу с помощью jQuery / AJAX. Ниже у нас есть обработчик нажатия кнопки, который загружает URL-адрес действия из атрибута данных на кнопке и запускает запрос GET для замены DIV, содержащегося в частичном представлении, обновленным содержимым.

$('.js-reload-details').on('click', function(evt) {
    evt.preventDefault();
    evt.stopPropagation();

    var $detailDiv = $('#detailsDiv'),
        url = $(this).data('url');

    $.get(url, function(data) {
        $detailDiv.replaceWith(data);         
    });
});

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

public ActionResult Details( int id )
{
    var model = ...get user from db using id...

    return PartialView( "UserDetails", model );
}

Предполагается, что ваше частичное представление является контейнером с идентификатором detailsDiv, так что вы просто заменяете всю вещь содержимым результата вызова.

Кнопка родительского просмотра

 <button data-url='@Url.Action("details","user", new { id = Model.ID } )'
         class="js-reload-details">Reload</button>

User - имя контроллера, а details - имя действия в @Url.Action(). Частичное представление UserDetails

<div id="detailsDiv">
    <!-- ...content... -->
</div>
person tvanfosson    schedule 15.10.2009
comment
Я продолжаю получать плохой запрос с этим примером кода, который вы дали. Я скопировал как есть и просто изменил действие контроллера, к которому он должен перейти. Я не уверен, для чего нужен пользователь. - person chobo2; 08.11.2009
comment
Я просто использовал некоторые вероятные имена контроллеров и действий, так как вы не включили никакого кода, который мы могли бы использовать. Просто замените детали своим действием, а пользователя - именем вашего контроллера. - person tvanfosson; 08.11.2009
comment
Еще раз спасибо за отличный ответ tvanfosson. - person ; 03.11.2010
comment
есть идеи, как это будет работать с Razor? попробовал $ .get (@ Url.Action (\ Manifest \, \ Upload \, new {id = + key +}), function (data) {$ (‹div /›). replaceWith (data);}); - person Patrick Lee Scott; 24.05.2011
comment
@Patrick - я бы использовал одинарные кавычки (двойные сложнее читать) для JS. Независимо от того, что вам не нужно заключать кавычки в кавычки или создавать строку - просто позвольте UrlHelper сделать это. См. Мой обновленный пример. - person tvanfosson; 24.05.2011
comment
Отлично работает спасибо! Почему кэшируется частичное представление? В моем частичном представлении я просто выводю текущую дату и время. - person Rick Glos; 06.01.2012
comment
Моя беда, проблема заключалась в том, что элемент был заменен и больше не был доступен для замены во второй раз. - person Rick Glos; 06.01.2012
comment
Превосходное решение. И исправил для меня проблему с состоянием просмотра дерева - person Israfel; 07.07.2012
comment
Глядя на предоставленный код контроллера - есть ли вероятность, что «частичный» должен быть «частичный просмотр»? Я получаю сообщение об ошибке, описанное здесь: stackoverflow.com/questions/17205888/ - person justSteve; 20.06.2013
comment
@justSteve хороший улов! Обновлено. - person tvanfosson; 20.06.2013
comment
@tvanfosson, пожалуйста, подумайте об использовании .html. Я был вынужден придумать какой-то трюк $('#partialView').children('span').replaceWith('<span>' + data + '</span>');, чтобы всегда иметь диапазон для замены новым контентом. Лучший Луис - person Custodio; 21.06.2013
comment
@ Custódio это просто пример, но идея была бы в том, что сам партиал был бы целым контейнером, то есть был бы обернут <div id="detailsDiv">...</div>, тогда вы просто заменили бы весь контейнер новым представлением. Если ваш партиал не включает контейнер, просто используйте $('#detailsDiv').html(data); - person tvanfosson; 21.06.2013
comment
Как получить доступ к модели из javascript? - person prthrokz; 16.08.2013
comment
Очень хороший материал. Интересно, есть ли у идеи первого плаката достоинства? Было бы неплохо решить задачу replaceWith для полноты. - person Shawn J. Molloy; 29.12.2013
comment
Есть ли способ избежать встроенного javascript с помощью этого решения? - person Odys; 12.01.2014
comment
@Odys - для этого не требуется встроенный JavaScript. Весь JavaScript может быть в отдельных файлах. - person tvanfosson; 13.01.2014
comment
@tvanfosson Значит, javascript поддерживает бритву? - person Odys; 13.01.2014
comment
@Odys Я понимаю, что вы имеете в виду, но на самом деле это только для этого конкретного примера. В противном случае сложно показать, как бы вы все это соединили воедино. На самом деле я бы, вероятно, использовал атрибуты данных для клея. - person tvanfosson; 13.01.2014
comment
Я использую этот метод для загрузки таблицы. Но теперь по какой-то причине моя таблица данных JQuery не работает? И я думаю, что это связано с загрузкой контента. - person Zapnologica; 27.02.2014
comment
@Zapnologica - если вы перезагружаете всю таблицу, вам может потребоваться повторно применить плагин, так как элементы DOM, к которым он был первоначально подключен, были заменены. Возможно, лучше подключить его к методу, который возвращает данные в формате JSON, datatables.net/examples /data_sources/server_side.html - person tvanfosson; 27.02.2014
comment
@tvanfosson Я пробовал этот пример со страницей cshtml. Ну, это не сработало. Я предполагаю, что мне нужно попробовать другой подход (?). Я оставил div пустым, думая, что он загрузит частичное представление в ‹div id = detailsDiv›. Я отлаживал jquery и метод Action, и эта часть работает. но после того, как я вернусь: return PartialView (UserDetails, model); в методе действия Details div пуст. Что я делаю неправильно? это может быть неправильный подход (?). У вас или у кого-нибудь есть идеи? - person George Geschwend; 04.01.2018
comment
@GeorgeGeschwend Я уверен, что этот метод работает. Проверьте, не видите ли вы ошибки в консоли. Проверьте, находят ли селекторы jQuery ожидаемые элементы (с помощью отладчика браузера). Убедитесь, что частичное представление, которое вы возвращаете через AJAX, действительно содержит ожидаемые данные. - person tvanfosson; 04.01.2018
comment
@tvanfosson Итак, то, что я делал, наконец-то сработало (!). Все свелось к орфографической ошибке. закатывает глаза $ detailDiv - это то, что я создал как var в jquery, ergo: var $ detailDiv = $ ('# detailsDiv'), ... а позже в jquery у меня был $ detailsDiv .. .ergo: $ detailsDiv.replaceWith (данные); так что это меня по-королевски облажало. Спасибо за отличный пример! :) - person George Geschwend; 05.01.2018

Для этого я использовал загрузку ajax:

$('#user_content').load('@Url.Action("UserDetails","User")');
person Prasad    schedule 12.11.2009
comment
Как правило, я думаю, что вам лучше использовать помощник Url.Action вместо жесткого кодирования пути. Это сломается, если ваш веб-сайт находится в подкаталоге, а не в корне. Использование помощника устраняет эту проблему и позволяет добавлять параметры с динамически устанавливаемыми значениями. - person tvanfosson; 03.11.2010
comment
Вы могли бы сделать $ ('# user_content'). Load ('@ Url.Content (~ / User / UserDetails)'), чтобы обойти это - я часто использую этот метод, если мне нужен javascript для ввода параметров строки запроса в конец URL - person Shawson; 30.04.2012
comment
В этом ответе UserDetails - это имя действия, а не частичное представление, верно? - person Maxim V. Pavlov; 12.06.2012
comment
да. UserDetails - это имя действия, которое возвращает PartialView. - person Prasad; 12.06.2012
comment
@Prasad: URL-адреса всегда следует оценивать с использованием @Url.Action("ActionName","ControllerName", new { area = "AreaName" } ) вместо выполнения ручного кодирования. - person Imad Alazani; 21.06.2013
comment
@PKKG. @ Url.Action () оценивается только в Razor. это не работает, если OP хочет поместить свой код в отдельный файл js и ссылаться на него. - person Michael; 04.07.2013
comment
@Michael: нельзя ли инициализировать переменную js в представлении и получить к ней доступ в файле Js ?? - person Imad Alazani; 04.07.2013
comment
@PKKG: Конечно, вы можете это сделать, но это не дает возможности поместить весь ваш js-код в отдельный файл. - person Michael; 04.07.2013
comment
@prasad мне нужно отправить модель частичного просмотра в действие, затем выполнить некоторые задачи, наконец, обновить модель и отправить обратно в частичное и обновить частичное. Как я могу отправить модель, например, как form.serialize в нагрузке? Я думаю, что это невозможно, но если у вас есть идеи, поделитесь. - person QMaster; 11.04.2014
comment
Будьте осторожны с этим решением. IE имеет тенденцию кэшировать содержимое частичного представления. Поскольку здесь нет параметра, отключающего кеш, вы можете загрузить устаревшие данные. - person spadelives; 06.05.2015
comment
@ Прасад, что здесь #user-content? - person WAQ; 16.04.2017
comment
@WAQ это идентификатор элемента div - person Prasad; 17.04.2017

@tvanfosson потрясает своим ответом.

Однако я бы предложил улучшение в js и небольшую проверку контроллера.

Когда мы используем помощник @Url для вызова действия, мы получим отформатированный html. Было бы лучше обновлять содержимое (.html), а не сам элемент (.replaceWith).

Подробнее о: В чем разница между replaceWith () и html () в jQuery ?

$.get( '@Url.Action("details","user", new { id = Model.ID } )', function(data) {
    $('#detailsDiv').html(data);
}); 

Это особенно полезно в деревьях, где содержимое можно менять несколько раз.

В контроллере мы можем повторно использовать действие в зависимости от запрашивающей стороны:

public ActionResult Details( int id )
{
    var model = GetFooModel();
    if (Request.IsAjaxRequest())
    {
        return PartialView( "UserDetails", model );
    }
    return View(model);
}
person Custodio    schedule 21.06.2013

Еще одна вещь, которую вы можете попробовать (на основе ответа tvanfosson), заключается в следующем:

<div class="renderaction fade-in" 
    data-actionurl="@Url.Action("details","user", new { id = Model.ID } )"></div>

А затем в разделе скриптов вашей страницы:

<script type="text/javascript">
    $(function () {
        $(".renderaction").each(function (i, n) {
            var $n = $(n),
                url = $n.attr('data-actionurl'),
                $this = $(this);

            $.get(url, function (data) {
                $this.html(data);
            });
        });
    });

</script>

Это отображает ваше действие @ Html.RenderAction с помощью ajax.

И чтобы сделать все это фанатом sjmansy, вы можете добавить эффект плавного появления, используя этот CSS:

/* make keyframes that tell the start state and the end state of our object */
@-webkit-keyframes fadeIn { from { opacity:0; } to { opacity:1; } }
@-moz-keyframes fadeIn { from { opacity:0; } to { opacity:1; } }
@keyframes fadeIn { from { opacity:0; } to { opacity:1; } }

.fade-in {
    opacity: 0; /* make things invisible upon start */
    -webkit-animation: fadeIn ease-in 1; /* call our keyframe named fadeIn, use animattion ease-in and repeat it only 1 time */
    -moz-animation: fadeIn ease-in 1;
    -o-animation: fadeIn ease-in 1;
    animation: fadeIn ease-in 1;
    -webkit-animation-fill-mode: forwards; /* this makes sure that after animation is done we remain at the last keyframe value (opacity: 1)*/
    -o-animation-fill-mode: forwards;
    animation-fill-mode: forwards;
    -webkit-animation-duration: 1s;
    -moz-animation-duration: 1s;
    -o-animation-duration: 1s;
    animation-duration: 1s;
}

Человек, я люблю mvc :-)

person Peter    schedule 29.10.2014
comment
Почему каждый из вас работал? Как это работает? Есть ли у вас что-то вроде: [email protected] (details, user, new {id = Model.ID} data-actionurl = Другое действие? - person user3818229; 22.12.2015
comment
Нет, каждая функция перебирает все элементы html, которые имеют атрибут data-actionurl, и заполняет его, вызывая запрос ajax для метода действия. Итак, несколько <div class="renderaction fade-in" ...></div> элементов. - person Peter; 22.12.2015

Вам нужно будет создать действие на вашем контроллере, которое возвращает результат визуализации частичного представления или элемента управления «UserDetails». Затем просто используйте Http Get или Post из jQuery для вызова Action, чтобы отобразить визуализированный html.

person Chris Pietschmann    schedule 15.10.2009
comment
как установить интервал времени для обновления обновленных данных в этой функции jQuery - person Neeraj Mehta; 22.11.2013

Использование стандартного вызова Ajax для достижения того же результата

        $.ajax({
            url: '@Url.Action("_SearchStudents")?NationalId=' + $('#NationalId').val(),
            type: 'GET',
            error: function (xhr) {
                alert('Error: ' + xhr.statusText);

            },
            success: function (result) {

                $('#divSearchResult').html(result);
            }
        });




public ActionResult _SearchStudents(string NationalId)
        {

           //.......

            return PartialView("_SearchStudents", model);
        }
person ASalameh    schedule 15.12.2018

У меня так получилось.

$(document).ready(function(){
    $("#yourid").click(function(){
        $(this).load('@Url.Action("Details")');
    });
});

Метод подробностей:

public IActionResult Details()
        {

            return PartialView("Your Partial View");
        }
person Avan    schedule 19.09.2017

Если вам нужно ссылаться на динамически сгенерированное значение, вы также можете добавить параметры строки запроса после URL-адреса @. Действуйте следующим образом:

    var id = $(this).attr('id');
    var value = $(this).attr('value');
    $('#user_content').load('@Url.Action("UserDetails","User")?Param1=' + id + "&Param2=" + value);


    public ActionResult Details( int id, string value )
    {
        var model = GetFooModel();
        if (Request.IsAjaxRequest())
        {
            return PartialView( "UserDetails", model );
        }
        return View(model);
    }
person Rider Harrison    schedule 25.07.2019