javascript - Gjør delvis visning ved hjelp av jQuery i ASP.NET MVC


Hvordan gjengir jeg den delvise visningen ved hjelp av jQuery?

Vi kan gjengi den delvise visningen slik:

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

Hvordan kan vi gjøre det samme ved å bruke jquery?

Svar #1

Du kan ikke gjengi en delvis visning bare ved å bruke jQuery. Du kan derimot kalle en metode (handling) som vil gjengi den delvise visningen for deg og legge den til siden ved hjelp av jQuery/AJAX. Nedenfor har vi en knappetrykkbehandler som laster URL-en for handlingen fra et data-attributt på knappen og sender en GET-forespørsel for å erstatte DIV-en som er inneholdt i den delvise visningen med det oppdaterte innholdet.

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

der bruker-kontrolleren har en handling kalt detaljer som gjør:

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

    return PartialView( "UserDetails", model );
}

Dette antar at ditt delvis visning er en beholder med id-en detailsDiv slik at du bare erstatter hele greia med innholdet fra resultatet av kallet.

Foreldrevisningsknapp

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

User er kontrollernavn og details er handlingsnavn i @Url.Action(). UserDetails delvis visning

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

Svar #2

Jeg har brukt ajax last for å gjøre dette:

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

Svar #3

@tvanfosson rocker med svaret sitt.

Jeg vil imidlertid foreslå en forbedring i js og en liten kontroll av controlleren.

Når vi bruker @Url hjelpefunksjon for å kalle en handling, kommer vi til å motta en formatert HTML. Det ville være bedre å oppdatere innholdet (.html) og ikke det faktiske elementet (.replaceWith).

Mer om på: Hva er forskjellen mellom jQuerys replaceWith() og html()?

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

Dette er spesielt nyttig i trær, hvor innholdet kan endres flere ganger.

På kontrolleren kan vi gjenbruke handlingen avhengig av forespørrer:

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

Svar #4

En annen ting du kan prøve (basert på tvanfossons svar) er dette:

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

Og deretter i skriptseksjonen på siden din:

<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>

Dette gjør at din @Html.RenderAction bruker ajax.

Og for å gjøre det hele fancy sjmansy kan du legge til en fade-in-effekt ved å bruke denne CSS-en:

/* 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;
}

Mann jeg elsker mvc :-)

Svar #5

Du må lage en Action på din Controller som returnerer det rendrerte resultatet av 'UserDetails'-delvis visning eller kontroll. Deretter kan du bare bruke en Http Get eller Post fra jQuery for å kalle Action for å få det rendrerte HTML-et som skal vises.

Relaterte artikler