Kết xuất chế độ xem một phần bằng jQuery trong ASP.NET MVC


223

Làm cách nào để hiển thị chế độ xem một phần bằng jquery?

Chúng ta có thể hiển thị Chế độ xem một phần như thế này:

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

Làm thế nào chúng ta có thể làm tương tự bằng cách sử dụng jquery?


Bạn có thể có một cái nhìn vào bài viết dưới đây là tốt. tugberkugurlu.com/archive/ đá Nó theo một cách tiếp cận khác và nâng cao cách thức.
tugberk

Câu hỏi ngu ngốc. UserDetails có phải là một phần xem dưới dạng trang cshtml: UserDetails.cshtml không? Tôi đang cố gắng để tải một phần xem. Và thông thường tôi sẽ sử dụng: @ Html.Partial ("~ / Lượt xem / PartialViews / FirstPartialViewTwo.cshtml")
George Geschwend

1
@GeorgeGeschwend, Không có gì là ngu ngốc ở đây, cho đến khi ai đó có thể trả lời nó. UserDetails (UserDetails.cshtml) là Chế độ xem một phần bên trong Bộ điều khiển người dùng. Như trong các bình luận của câu trả lời được đánh dấu, tốt hơn là sử dụng Url.Action thay vì mã hóa cứng đường dẫn đầy đủ của chế độ xem.
Prasad

Câu trả lời:


286

Bạn không thể hiển thị chế độ xem một phần chỉ bằng jQuery. Tuy nhiên, bạn có thể gọi một phương thức (hành động) sẽ hiển thị chế độ xem một phần cho bạn và thêm nó vào trang bằng jQuery / AJAX. Ở bên dưới, chúng tôi có trình xử lý nhấp vào nút tải url cho hành động từ thuộc tính dữ liệu trên nút và thực hiện yêu cầu GET để thay thế DIV có trong chế độ xem một phần bằng nội dung được cập nhật.

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

trong đó bộ điều khiển người dùng có một hành động có tên là chi tiết:

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

    return PartialView( "UserDetails", model );
}

Điều này giả định rằng chế độ xem một phần của bạn là một thùng chứa với id detailsDivđể bạn chỉ cần thay thế toàn bộ nội dung bằng nội dung của kết quả cuộc gọi.

Nút xem phụ huynh

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

Userlà tên bộ điều khiển và detailslà tên hành động trong @Url.Action(). UserDetails xem một phần

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

Tôi tiếp tục nhận được yêu cầu xấu với mã ví dụ này mà bạn đã đưa ra. Tôi đã sao chép nguyên trạng và chỉ thay đổi hành động Bộ điều khiển cần thực hiện. Tôi không chắc chắn "người dùng" là gì.
chobo2

1
Tôi chỉ sử dụng một số tên hành động và trình điều khiển "có khả năng" vì bạn không bao gồm bất kỳ mã nào mà chúng tôi có thể đi theo. Chỉ cần thay thế "chi tiết" bằng hành động của bạn và "người dùng" bằng tên bộ điều khiển của bạn.
tvanfosson

1
Cảm ơn một lần nữa cho một câu trả lời tuyệt vời tvanfosson.

Bất cứ ý tưởng làm thế nào điều này sẽ làm việc với dao cạo? đã thử $ .get ("@ Url.Action (\" Manifest \ ", \" Upload \ ", mới {id =" + key + "})", hàm (dữ liệu) {$ ("<div />") .replaceWith (dữ liệu);});
Patrick Lee Scott

1
@Zapnologica - nếu bạn tải lại toàn bộ bảng, bạn có thể cần phải áp dụng lại plugin vì các thành phần DOM mà nó được kết nối ban đầu đã được thay thế. Có thể tốt hơn khi kết nối nó với một phương thức trả về dữ liệu dưới dạng JSON, datatables.net/examples/data_source/server_side.html
tvanfosson

152

Tôi đã sử dụng tải ajax để làm điều này:

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

46
Nói chung, tôi nghĩ rằng bạn tốt hơn nên đi với trình trợ giúp Url.Action thay vì mã hóa cứng đường dẫn. Điều này sẽ phá vỡ nếu trang web của bạn nằm trong thư mục con chứ không phải ở thư mục gốc. Sử dụng trình trợ giúp khắc phục sự cố đó và cho phép bạn thêm các tham số với các giá trị được đặt động.
tvanfosson

18
Bạn có thể thực hiện $ ('# user_content'). Load ('@ Url.Content ("~ / User / UserDetails")') để giải quyết vấn đề đó - tôi thường sử dụng phương thức này nếu tôi cần javascript để vỗ vào các tham số chuỗi truy vấn ở cuối url
Shawson

Trong câu trả lời này, UserDetailslà tên của một hành động, không phải là một phần xem, phải không?
Maxim V. Pavlov

4
@Prasad: url nên luôn luôn được đánh giá sử dụng @Url.Action("ActionName","ControllerName", new { area = "AreaName" } )thay vì làm Handcoding .
Imad Alazani

3
@PKKG. @ Url.Action () chỉ đánh giá trong Dao cạo. điều này không hoạt động nếu OP muốn đặt mã của họ vào một tệp js riêng và tham chiếu nó.
Michael

60

@tvanfosson đá với câu trả lời của mình.

Tuy nhiên, tôi sẽ đề xuất một cải tiến trong js và kiểm tra bộ điều khiển nhỏ.

Khi chúng ta sử dụng @Urltrợ giúp để gọi một hành động, chúng ta sẽ nhận được một định dạng html. Sẽ tốt hơn nếu cập nhật nội dung ( .html) chứ không phải yếu tố thực tế (.replaceWith ).

Thông tin thêm về tại: Sự khác biệt giữa thay thế của jQueryWith () và html () là gì?

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

Điều này đặc biệt hữu ích trong cây, nơi nội dung có thể được thay đổi nhiều lần.

Tại bộ điều khiển, chúng ta có thể sử dụng lại hành động tùy thuộc vào người yêu cầu:

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

11

Một điều khác bạn có thể thử (dựa trên câu trả lời của tvanfosson) là:

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

Và sau đó trong phần tập lệnh của trang của bạn:

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

Điều này làm cho @ Html.RenderAction của bạn sử dụng ajax.

Và để làm cho tất cả sjmansy cuồng nhiệt, bạn có thể thêm hiệu ứng mờ dần bằng cách sử dụng css này:

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

Người đàn ông tôi yêu mvc :-)


Tại sao bạn từng chức năng? Làm thế nào nó hoạt động? Bạn có biết thứ gì đó như: data-actionurl = "@ Url.Action (" chi tiết "," người dùng ", mới {id = Model.ID} data-actionurl =" Another Action "không?
user3818229

Không, mỗi hàm lặp trên tất cả các phần tử html có thuộc tính data-actionurl và điền vào nó bằng cách gọi một yêu cầu ajax cho phương thức hành động. Vì vậy, nhiều <div class="renderaction fade-in" ...></div>yếu tố.
Peter

9

Bạn sẽ cần tạo một Hành động trên Bộ điều khiển của mình để trả về kết quả được hiển thị của chế độ xem hoặc điều khiển một phần "UserDetails". Sau đó, chỉ cần sử dụng một Get Get hoặc Post từ jQuery để gọi Action để hiển thị html được hiển thị.


cách đặt khoảng thời gian để làm mới dữ liệu cập nhật trong hàm jQuery này
Neeraj Mehta

5

Sử dụng lệnh gọi Ajax tiêu chuẩn để đạt được kết quả tương tự

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

Tôi đã làm nó như thế này.

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

Phương pháp chi tiết:

public IActionResult Details()
        {

            return PartialView("Your Partial View");
        }

0

Nếu bạn cần tham chiếu một giá trị được tạo động, bạn cũng có thể nối các tham số chuỗi truy vấn sau @ URL.Action như vậy:

    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);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.