2009-09-03 50 views
72

Tôi rất mới phát triển ứng dụng web và tôi nghĩ tôi sẽ bắt đầu với công nghệ gần đây và vì vậy tôi đang cố gắng tìm hiểu asp.net cũng như khuôn khổ MVC cùng một lúc. Đây có lẽ là một câu hỏi rất đơn giản cho bạn, các chuyên gia MVC.asp.net MVC part view controller action

Câu hỏi của tôi là một lượt xem có hành động được liên kết và nếu có, hành động này có được gọi bất cứ khi nào một trang bình thường sử dụng RenderPartial() trên chế độ xem một phần không?

Trả lời

130

Mặc dù bạn có thể có một hành động trả lại một phần lượt xem, bạn không cần một hành động để hiển thị chế độ xem một phần. RenderPartial lấy một phần khung nhìn và hiển thị nó, sử dụng mô hình đã cho và xem dữ liệu nếu được cung cấp, vào khung nhìn hiện tại (cha mẹ).

Bạn có thể muốn một hành động trả lại một phần lượt xem nếu bạn đang sử dụng AJAX để tải/tải lại một phần của trang. Trong trường hợp đó, việc trả lại chế độ xem đầy đủ không mong muốn vì bạn chỉ muốn tải lại một phần của trang. Trong trường hợp này, bạn có thể thực hiện hành động vừa trả lại một phần xem tương ứng với phần đó của trang.

cơ chế Chuẩn

Tận dụng xem một phần trong một cái nhìn bình thường (không cần hành động)

...some html... 
<% Html.RenderPartial("Partial", Model.PartialModel); %> 
...more html.. 

Ajax cơ chế

Reloading một phần của trang thông qua AJAX (lưu ý một phần được hiển thị trong trang tải ban đầu)

...some html... 
<div id="partial"> 
<% Html.RenderPartial("Partial", Model.PartialModel); %> 
</div> 
...more html... 

<script type="text/javascript"> 
    $(function() { 
     $('#someButton').click(function() { 
      $.ajax({ 
       url: '/controller/action', 
       data: ...some data for action..., 
       dataType: 'html', 
       success: function(data) { 
       $('#partial').html(data); 
       }, 
       ... 
      }); 
     }); 
    }); 
</script> 

điều khiển cho AJAX

public ActionResult Action(...) 
{ 
    var model = ... 

    ... 

    if (Request.IsAjaxRequest()) 
    { 
      return PartialView("Partial", model.PartialModel); 
    } 
    else 
    { 
      return View(model); 
    } 
} 
+0

Tôi thấy, tôi chỉ đang phát xung quanh với mẫu VS cho ứng dụng MVC. Tôi đang cố gắng hiển thị nhiều danh sách khách hàng ví dụ trong một chế độ xem một phần. Tôi hiện đang có một lớp mô hình chuyển dữ liệu, làm thế nào tôi có thể gửi mô hình này đến một phần xem mà không liên quan đến xem trang mà làm cho xem một phần này? Cảm ơn sự giúp đỡ của bạn! – yogibear

+1

Phần này luôn được bao gồm trong chế độ xem chính. Thời gian duy nhất bạn sẽ trả lại một phần của riêng nó sẽ là nếu bạn đang cập nhật thông qua AJAX. Có lẽ bạn sẽ sử dụng một phần để hiển thị ** danh sách khách hàng **. Bạn có lẽ, có lẽ, sử dụng một vòng lặp foreach trong quan điểm của bạn để lặp qua các danh sách (chứa trong mô hình khung nhìn), chuyển từng phần một đến một phần làm mô hình của nó. – tvanfosson

+0

+1 Rất tốt! Câu trả lời hay. –

3

Câu trả lời được chấp nhận là hoàn toàn chính xác, nhưng tôi muốn thêm rằng bạn có thể tải xem một phần của bạn sử dụng jQuery tải. Cần ít cấu hình hơn, nếu bạn không muốn xem xét đồng thời.

$("#Your-Container").load("/controller/action/id"); 
+1

Một lời khuyên là sử dụng Url.Action vì hardcoding đường dẫn như thế này sẽ phá vỡ các ứng dụng trên thay đổi tuyến đường hoặc thay đổi cấu trúc bản đồ. –

+0

Hoàn toàn đồng ý với bạn @JpHouten. – Saeid

0

Câu trả lời là không. Nhưng đôi khi bạn cần một số hành động điều khiển phía sau một phần xem. Sau đó, bạn có thể tạo một actionMethod mà trả về một phần xem. ActionMethod Điều này có thể được gọi trong cái nhìn khác:

@Html.Action("StockWarningsPartial", "Stores") 

Các ActionMethod thể trông giống như:

public ActionResult StockWarningsPartial() 
{ 
     ....    
     return View("StockWarningsPartial", warnings); 

} 

và xem 'StockWarningsPartial.cshtml' bắt đầu với:

@{ 
    Layout = null; 
} 

để làm cho nó không hiển thị lại bố cục xung quanh của bạn.

1

Tôi đã có thể đạt được điều gì đó tương tự với logic này.

Trong .cshtml

@Html.Action("ActionMethodName", "ControllerName"); 

Trong điều khiển

[Route("some-action")] 
public ActionResult ActionMethodName() 
{ 
    var someModel = new SomeModel(); 
    ... 
    return PartialView("SomeView.cshtml", someModel); 
} 

Và đó là nó.

Nếu bạn cần chuyển giá trị từ .cshtml sang phương thức hành động thì có thể.

+1

Ví dụ hoàn hảo. Bạn đã cho thấy sự tương tác và mã trong cả bộ điều khiển và xem trong một cách rõ ràng và rõ ràng theo cách thức. Với ra fluff. Cảm ơn bạn. – eaglei22

Các vấn đề liên quan