2010-04-18 35 views

Trả lời

26

Return View() - Renders một .aspx | .cshtml trang

  • Hiển thị đường trang aspx bình thường mà cũng có thể chứa một phần Lượt xem

Trả lại PartialView() - Người cho vay .ascx | .cshtml Kiểm soát

  • Cho phép phân đoạn HTML tới trình duyệt có thể được yêu cầu thông qua các yêu cầu AJAX hoặc Non-AJAX.

View() trả về ViewResult PartialView() trả về PartialViewResult đều kế thừa từ ViewResultBase

Sự khác biệt được mô tả bởi Reflector dưới đây ...

public class PartialViewResult : ViewResultBase 
{ 
    // Methods 
    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     ViewEngineResult result = base.ViewEngineCollection.FindPartialView(context, base.ViewName); 
     if (result.View != null) 
     { 
     return result; 
     } 
     StringBuilder builder = new StringBuilder(); 
     foreach (string str in result.SearchedLocations) 
     { 
     builder.AppendLine(); 
     builder.Append(str); 
     } 
     throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.Common_PartialViewNotFound, new object[] { base.ViewName, builder })); 
    } 
} 


public class ViewResult : ViewResultBase 
{ 
    // Fields 
    private string _masterName; 

    // Methods 
    protected override ViewEngineResult FindView(ControllerContext context) 
    { 
     ViewEngineResult result = base.ViewEngineCollection.FindView(context, base.ViewName, this.MasterName); 
     if (result.View != null) 
     { 
     return result; 
     } 
     StringBuilder builder = new StringBuilder(); 
     foreach (string str in result.SearchedLocations) 
     { 
     builder.AppendLine(); 
     builder.Append(str); 
     } 
     throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.Common_ViewNotFound, new object[] { base.ViewName, builder })); 
    } 

    // Properties 
    public string MasterName 
    { 
     get 
     { 
     return (this._masterName ?? string.Empty); 
     } 
     set 
     { 
     this._masterName = value; 
     } 
    } 
} 
+4

tôi muốn downvote nếu tôi có thể, nhưng ReturnView() vs View() hoàn toàn không có gì để làm với một khung nhìn ".aspx" hoặc ".ascx" được hiển thị hay không. CORRECTION - có vẻ như nó thực sự có thể xử lý khung nhìn nào được tìm nạp bằng cách sử dụng quy ước (ví dụ: bộ điều khiển hiển thị chế độ xem cùng tên). bất kể, bạn có thể nạp cả dạng .aspx và .ascx vào PartialView() mà không có vấn đề gì. – kdawg

+3

'View()' trả về 'ViewResult' và PartialView() trả về một' PartialViewResult'. Chạy Reflector trên hai phương thức cho chính bạn và xem cái nào bạn nên sử dụng khi quyết định những gì để render. 'PartialViewResult' và' ViewResult' là hai lớp khác nhau mà cả hai đều kế thừa từ 'ViewResultBase', được dành cho các mục đích khác nhau! PartialViews không có MasterPages (Views có thể), bạn có thực sự sẽ trả về "' somecontrol.ascx' "bằng cách sử dụng' View() '... – xandercoded

1

Hành động của bộ điều khiển thường trả về một phần xem khi AJAX được sử dụng và bản cập nhật của khu vực trang được thể hiện bằng xem một phần được thực hiện. Cách thông thường để sử dụng một phần lượt xem chỉ đơn giản là gọi Html.RenderPartial bên trong chế độ xem chính của bạn.

14

return PartialView() trả về đoạn mã HTML và nó được sử dụng với các tệp ViewUserControls - ASCX. Ưu điểm chính của việc sử dụng "return PartialView()" là khi bạn không muốn hiển thị tất cả các công cụ trang HTML khác, như HTML, BODY, HEAD tags.

Một trong những cách sử dụng phổ biến nhất của tôi là khi tôi muốn chỉ hiển thị điều khiển người dùng dựa trên việc yêu cầu hành động là cuộc gọi AJAX hay không.

Vì vậy, tôi có một dạng xem được gọi là MyControl.aspx, nơi tôi sử dụng trợ giúp HTML RenderPartial và tôi có một phần Xem tên là MyControl.ascx nơi tôi thực hiện kết xuất thực tế.

tôi có thể chuyển qua lại giữa hai trong hành động điều khiển của tôi như thế này:

if (Request.IsAjaxRequest()) 
    return PartialView("MyControl"); // this renders MyControl.ascx 

return View(); // this render MyControl.aspx