Надання часткового перегляду за допомогою jQuery в ASP.NET MVC


223

Як мені зробити частковий вигляд за допомогою jquery?

Ми можемо надати частковий вид таким чином:

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

Як ми можемо зробити те ж саме, використовуючи jquery?


Ви також можете подивитись на статтю нижче. tugberkugurlu.com/archive/… Це дотримується іншого підходу та покращує шлях.
тугберк

Дурне питання. Чи UserDetails є частковим переглядом як сторінка cshtml: UserDetails.cshtml? Я намагаюся завантажити частковий вигляд. І зазвичай я б використовував: @ Html.Partial ("~ / Views / PartialViews / FirstPartialViewTwo.cshtml")
Джордж Гешвенд

1
@GeorgeGeschwend, тут нічого не дурного, поки хтось не зможе на це відповісти. UserDetails (UserDetails.cshtml) - це часткове подання всередині Контролера користувача. Як і в коментарях поміченої відповіді, краще використовувати Url.Action, а не жорстке кодування повного шляху перегляду.
Прасад

Відповіді:


286

Ви не можете надати частковий вигляд, використовуючи лише 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);         
    });
});

де контролер користувача має дії, названі деталями:

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(). Часткове подання користувачаDetails

<div id="detailsDiv">
    <!-- ...content... -->
</div>

Я продовжую отримувати поганий запит із цим прикладом коду, який ви дали. Я скопіював, як є, і просто змінив дію контролера, на який він повинен перейти. Я не впевнений, що таке "користувач".
chobo2

1
Я просто використав кілька "ймовірних" імен контролера та дій, оскільки ви не включили код, який ми могли б пройти. Просто замініть "деталі" на свою дію, а "користувач" - на ім'я контролера.
tvanfosson

1
Ще раз дякую за чудову відповідь tvanfosson.

будь-яка ідея, як це буде працювати з Razor? спробував $ .get ("@ Url.Action (\" Маніфест \ ", \" Завантажити \ ", новий {id =" + клавіша + "})", функція (дані) {$ ("<div />") .replaceWith (дані);});
Патрік Лі Скотт

1
@Zapnologica - якщо ви перезавантажуєте всю таблицю, вам може знадобитися повторно застосувати плагін, оскільки замінено елементи DOM, до яких він був спочатку підключений. Можливо, буде краще підключити його до методу, який повертає дані як JSON, datatables.net/examples/data_sources/server_side.html
tvanfosson

152

Для цього я використовував навантаження Ajax:

$('#user_content').load('@Url.Action("UserDetails","User")');

46
Як правило, я думаю, що вам краще піти з помічником Url.Action замість жорсткого кодування шляху. Це порушиться, якщо ваш веб-сайт знаходиться в підкаталозі, а не в корені. Використання помічника виправляє цю проблему і дозволяє додавати параметри з динамічно заданими значеннями.
tvanfosson

18
Ви можете зробити $ ('# user_content'). Load ('@ Url.Content ("~ / User / UserDetails") "), щоб обійти це - я часто використовую цей метод, якщо мені потрібен javascript, щоб ляпати парами запитів. наприкінці URL
Шосон

У цій відповіді UserDetails- назва дії, а не частковий погляд, правда?
Павлов Максим Вікторович

4
@Prasad: URL-адреси завжди слід оцінювати, використовуючи @Url.Action("ActionName","ControllerName", new { area = "AreaName" } )замість цього функцію Handcoding .
Імад Алазані

3
@PKKG. @ Url.Action () оцінюється лише в Razor. це не працює, якщо ОП хоче помістити свій код в окремий js-файл і посилатись на нього.
Майкл

60

@tvanfosson скелює своєю відповіддю.

Однак я б запропонував покращення в межах js та невелику перевірку контролера.

Коли ми використовуємо @Urlпомічник для виклику дії, ми отримуємо форматований html. Було б краще оновити вміст ( .html), а не власне елемент ( .replaceWith).

Детальніше про те: Яка різниця між jQuery's substituWith () та html ()?

$.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);
}

11

Ще одна річ, яку ви можете спробувати (на основі відповіді 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 :-)


Чому ви виконували кожну функцію? Як це працює? Ви робите щось на зразок: data-actionurl = "@ Url.Action (" деталі "," користувач ", новий {id = Model.ID} data-actionurl =" Інша дія "?
user3818229

Ні, кожна функція перетворює цикл на всі елементи html, які мають атрибут data-actionurl, і заповнює його, викликаючи запит ajax для методу дії. Так багато <div class="renderaction fade-in" ...></div>елементів.
Петро

9

Вам потрібно буде створити дію на своєму контролері, яка повертає виведений результат часткового перегляду або контролю "UserDetails". Потім просто використовуйте Http Отримати або Опублікувати з jQuery, щоб викликати Дію, щоб відобразити відображений HTML-код.


як встановити інтервал часу для оновлення оновлених даних у цій функції jQuery
Neeraj Mehta

5

Використовуючи стандартний дзвінок 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);
        }

0

Я зробив це так.

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

Детальний метод:

public IActionResult Details()
        {

            return PartialView("Your Partial View");
        }

0

Якщо вам потрібно посилатися на динамічно генероване значення, ви також можете додати параметри рядка запиту після @ 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);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.