2011-01-06 24 views
5

Chỉ cần tự hỏi tại sao hầu hết mọi phương thức điều khiển tôi thấy trong mã MVC mẫu trả về ActionResult, ngay cả khi rõ ràng là mã chỉ có thể trả về một loại kết quả. Tôi hiểu có một số trường hợp mà nó được bảo đảm bởi vì bạn có thể trở lại, nói một RedirectResult hoặc ViewResult tùy thuộc vào logic, nhưng đó không phải là trường hợp cho hầu hết các phương pháp tôi đã nhìn thấy.Tại sao hầu hết mã điều khiển mẫu MVC trả về ActionResult?

Không phải là tương đương với việc có loại trả về 'đối tượng' trên phương pháp? Tại sao không chỉ định JsonResult, hoặc FileResult hoặc ViewResult làm kiểu trả về? Có một lợi ích tôi không thấy để giải quyết kiểu trả về cho ActionResult trên mọi phương thức điều khiển?

dụ Classic:

public ActionResult Index() 
{ 
    return View(); 
} 

Tại sao điều này dường như là tiêu chuẩn thay vì điều này:

public ViewResult Index() 
{ 
    return View(); 
} 

EDIT: Cho đến nay tất cả các câu trả lời ngoại trừ một đã chỉ ra rằng ActionResult chỉ chung chung hơn. Tôi biết nhiều. :) Tại sao điều này được chấp nhận thực hành trên một phương pháp điều khiển mặc dù, và không phải bất cứ nơi nào khác? Bạn không chỉ trả về các lớp mức cơ sở cao nhất của một kiểu mà bạn có thể sử dụng trên một phương thức bình thường, bạn cố gắng trả lại kiểu cụ thể nhất mà bạn có thể thường làm. Điều gì làm cho các phương pháp điều khiển khác biệt đến nỗi các blogger và "các nhà văn mã mẫu" (vâng, tôi đã thực hiện thuật ngữ đó) sẽ chỉ là phương tiện để trả lại ActionResult?

+0

có thể trùng lặp của [Phương thức điều khiển ASP.NET MVC trả về ActionResult?] (Http://stackoverflow.com/questions/1021568/must-asp-net-mvc-controller-methods-return-actionresult) – bzlm

Trả lời

6

trích dẫn nguyên văn từ câu trả lời được chấp nhận ở đây trên SO. có ý nghĩa với tôi:

Must ASP.NET MVC Controller Methods Return ActionResult?

Bạn hoàn toàn có thể sử dụng cụ thể loại trở lại , mặc dù hầu hết các ví dụ trên web dường như để trả lại ActionResult. Lần duy nhất tôi sẽ trả lại lớp ActionResult là khi các đường dẫn khác nhau của phương thức hành động trả về các kiểu con khác nhau.

Steven Sanderson cũng khuyên bạn nên trả về các loại cụ thể trong cuốn sách Pro ASP.NET MVC Framework của mình. Hãy xem tại quote dưới đây:.

"phương pháp hành động này đặc biệt tuyên bố rằng nó sẽ trả về một thể hiện của ViewResult Nó sẽ chỉ làm việc tương tự nếu thay vì phương pháp trở lại loại là ActionResult (lớp cơ sở cho tất cả kết quả hành động). Trong thực tế, một số lập trình viên ASP.NET MVC khai báo tất cả phương pháp hành động của họ như là trả lại một ActionResult không đặc hiệu , ngay cả khi họ biết chắc chắn rằng nó sẽ luôn trở lại một lớp con cụ thể. Tuy nhiên, đó là một thiết lập tốt nguyên tắc trong hướng đối tượng lập trình rằng các phương thức phải trả lại loại cụ thể nhất có thể (như cũng như chấp nhận các loại thông số chung nhất chung nhất có thể). Theo sau nguyên tắc này tối đa hóa sự tiện lợi và tính linh hoạt cho mã gọi phương pháp của bạn, chẳng hạn như kiểm tra đơn vị của bạn. "

also see:

http://www.bengtbe.com/blog/post/2009/07/01/Use-specific-return-types-in-your-ASPNET-MVC-action-methods.aspx

+0

Làm cho tinh thần với tôi là tốt và tôi sẽ chấp nhận điều này như là câu trả lời, nhưng tôi vẫn tò mò là tại sao, trong một môi trường nơi các nhà phát triển được sử dụng để khai báo các kiểu trả về càng cụ thể càng tốt, tất cả các lập trình viên MVC đột nhiên dường như vừa mới đưa ra khái niệm đó trong một cá thể cụ thể. Không làm cho rất nhiều ý nghĩa. – Scott

+2

@Scott Schluer: Bởi vì "mã tiêu thụ" thực sự cho các hoạt động của bộ điều khiển thường là trình duyệt hoặc javascript, các lợi ích của an toàn kiểu ít rõ rệt hơn trong trường hợp cụ thể này. Nếu bạn có thể tiêu thụ mã này bằng một ngôn ngữ an toàn kiểu, cách khung RPC của GWT được thiết lập, tôi nghĩ mọi người sẽ tận tâm hơn về việc thiết lập các kiểu trả về cụ thể. – StriplingWarrior

+2

Tôi đã tìm thấy bằng cách sử dụng ActionResult cho tất cả chúng là khá tiện dụng. Tôi đồng ý rằng các mối quan tâm về an toàn loại giảm làm cho điều này trở nên tốt hơn trong tình huống cụ thể này. Tôi nghĩ rằng đây là một thực tế có nguồn gốc chủ yếu để thuận tiện và dễ đọc. Khi tôi thấy ActionReult, tôi biết mục đích của phương pháp là gì ngay lập tức. Và nếu tôi cần phải ném một chuyển hướng trên hành động đó, tôi không cần phải sửa đổi kiểu trả về để làm như vậy. – Derrick

0

Chỉ khi bạn không chắc chắn loại trả về sẽ là b/c của logic bên trong bộ điều khiển, bạn nên sử dụng kiểu trả về chung. nếu không - sử dụng cụ thể (được coi là BETTER lập trình).

Tôi không biết lý do tại sao mọi người sử dụng ActionResult trong các mẫu, nhưng tôi đã nhìn thấy nhiều điều trong các mẫu mà tôi có thể không đồng ý - mất những gì tốt và để lại phần còn lại có ....

IMHO - Bạn nên sử dụng ViewResult khi bạn biết đây là đối tượng trả về duy nhất bạn sử dụng và không phải ActionResults.

1

Dự đoán của tôi là ActionResult được trả về thay vì kết quả cụ thể hơn đơn giản vì không cần phải làm cho mã cụ thể hơn.

Sử dụng loại chung hơn giúp mọi thứ linh hoạt hơn.

Hãy nhớ rằng việc thay đổi kiểu trả về có thể không phải là một vấn đề trong dự án ứng dụng web, nhưng nó cũng sẽ khiến bạn thay đổi tất cả các kiểm thử đơn vị của bạn trong dự án thử nghiệm.

+0

Có vẻ như với tôi rằng nếu bạn thay đổi những gì bạn đang quay trở lại, bạn sẽ phải thay đổi các bài kiểm tra đơn vị của bạn để phản ánh thay đổi đó. Tôi muốn có trình biên dịch cho tôi biết "các bài kiểm tra đơn vị này sẽ không hoạt động nữa" khi điều này xảy ra. Trong hầu hết các trường hợp, các bài kiểm tra đơn vị của bạn sẽ phải đưa kết quả vào loại thực tế của nó để kiểm tra, ví dụ, Mô ​​hình trên ViewResult trả về có các giá trị bạn đang mong đợi. – StriplingWarrior

+0

@StriplingWarrior - Cá nhân, tôi muốn có thể xây dựng dự án của mình và sau đó phát hiện ra rằng Bài kiểm tra Đơn vị của tôi hiện không thành công thay vì phải giữ bản dựng dự án của tôi vì mã bị hỏng trong Bài kiểm tra Đơn vị. –

+0

Tôi cho rằng đó là vấn đề quan điểm. Cá nhân tôi cảm thấy bắt được nhiều vấn đề hơn vào thời gian biên dịch tiết kiệm thời gian và là một trong những lý do lớn nhất để sử dụng ngôn ngữ được biên dịch an toàn loại. – StriplingWarrior

0

Có thể vì ActionResult là đối tượng cao nhất mà chế độ xem có thể xử lý.

ActionResult

ViewResult

System.Object 
    System.Web.Mvc.ActionResult 
    System.Web.Mvc.ViewResultBase 
     System.Web.Mvc.ViewResult 

Đối với tôi, mỗi XXXResult là dành riêng cho sử dụng cụ thể. Nếu bạn không cần cụ thể ...

0

Tôi nghĩ lý do thực sự là mã được tạo tự động trong các mẫu MVC bắt đầu bạn bằng ActionResult và mọi người chỉ cần theo mẫu. Vì nhiều người không đơn vị kiểm tra hành động điều khiển của họ, họ không tiêu thụ các kết quả theo một cách an toàn kiểu mà sẽ làm cho điều này là một điểm đau.

+0

Điều đó có vẻ điên rồ. Xem http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx. Ngay cả Scott Guthrie cũng làm điều đó và tôi chắc chắn anh ấy không phải là người phát triển, những người sẽ chỉ theo dõi những gì xuất phát từ cái hộp vì thiếu hiểu biết. :) Một phương pháp điều khiển đơn giản mà chỉ trả về một cái nhìn, nhưng loại trả về là ActionResult ... – Scott

0

ScottGu sao nó prob 4 lý do tương tự, nó chỉ là dễ dàng hơn để hiển thị một ví dụ Các chủ đề của bản demo thường dictates chất lượng thơ ca ngợi bạn thấy;. nếu nó chỉ cho exmaples, họ thường sẽ ném một cái gì đó để gether chỉ để minh họa một điểm (họ đã làm cho nó dễ dàng trên mình để viết/kiểm tra các ví dụ về xuất bản b4 kết thúc của họ, và chỉ còn lại nó theo cách đó khi đăng bài; thực hiện điều này) Theo như thực hành tốt nhất, về HTML và JS (về cơ bản) "không quan tâm" nhiều về các loại, đừng để vấn đề với JavaScrip t (như loại điểm yếu) rò rỉ thông qua/lây nhiễm của riêng bạn mài giũa tốt phong cách mã hóa. Sử dụng loại máy chủ cụ thể có thể. Thêm vào đó, mã JS JS cũng có thể mong đợi một kết quả JSON (nếu nó được mã hóa bằng cách gõ các thực hành tốt nhất), và là mã mà mã có thể kiểm tra là tốt, vì vậy sẽ không muốn buộc tay mã JS ở đó nếu nó đang cố gắng để làm điều đúng trên các loại có thể. Đúng là trong một số trường hợp, các tác động bất lợi hơn/ít rõ rệt hơn ở những người khác (như trở về một loại lang ít an toàn hơn), nó chỉ là một thói quen lập trình tốt hơn để nhất quán. Nói chung, sử dụng loại kết quả usu này sẽ dẫn đến khả năng của đối tượng cụ thể hơn mà bạn muốn sử dụng khi trả về (nhiều khả năng sẽ không có sẵn trong đối tượng baser - nếu nó luôn luôn là, sau đó loại của bạn là quá cụ thể/nên là cơ sở anyway). Đúc vốn đã xấu xí/xấu xa; các kiểu phát sinh trong thời gian chạy sẽ luôn khiến bạn gặp rắc rối (tại sao thực hành đã bị nản chí/không có tính năng đánh máy/an toàn tĩnh/mạnh được mở rộng trong nhiều thập kỷ). Hãy để người tiêu dùng/người duy trì mã của bạn cũng có thể phân biệt thông qua metainfo (di chuột qua phương pháp, v.v.) chức năng thực sự đang thực hiện/quay trở lại. Và trên thực tế, nó là tốt hơn cho thử nghiệm đơn vị, vì đây là một điều kiện có thể được kiểm tra (như trích đoạn từ cuốn sách của Steven Sanderson ám chỉ). Và tôi có bắt được một chàng trai không muốn giữ một công trình xây dựng như một lý do bị đánh máy yếu không? Có thật không?

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