Truyền dữ liệu đến Trang chính trong ASP.NET MVC


102

Cách của bạn để truyền dữ liệu đến Trang chủ (sử dụng ASP.NET MVC) mà không vi phạm các quy tắc MVC là gì?

Cá nhân tôi thích viết mã bộ điều khiển trừu tượng (bộ điều khiển cơ sở) hoặc lớp cơ sở được chuyển cho tất cả các chế độ xem.


1
Tôi đã viết một hướng dẫn về cách tôi quản lý này: britishdeveloper.co.uk/2010/06/... nên giúp
BritishDeveloper

Câu trả lời:


77

Nếu bạn muốn chế độ xem của mình có các lớp dữ liệu chế độ xem được nhập mạnh, điều này có thể phù hợp với bạn. Các giải pháp khác có lẽ đúng hơn nhưng đây là sự cân bằng tuyệt vời giữa thiết kế và tính thực tế IMHO.

Trang chính có một lớp dữ liệu dạng xem được đánh máy mạnh chỉ chứa thông tin liên quan đến nó:

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

Mỗi chế độ xem sử dụng trang chính đó sẽ nhận một lớp dữ liệu chế độ xem được đánh máy mạnh có chứa thông tin của nó và lấy từ dữ liệu chế độ xem trang chính:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

Vì tôi không muốn các bộ điều khiển riêng lẻ biết bất cứ điều gì về việc tập hợp dữ liệu trang chủ nên tôi đóng gói logic đó vào một nhà máy được chuyển đến mỗi bộ điều khiển:

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

Kế thừa phù hợp với mối quan hệ chính để xem tốt nhưng khi nói đến hiển thị các phần / điều khiển người dùng, tôi sẽ soạn dữ liệu chế độ xem của họ thành dữ liệu xem trang, ví dụ:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

Đây chỉ là mã ví dụ và không nhằm mục đích biên dịch. Được thiết kế cho ASP.Net MVC 1.0.


4
Đây là phương pháp được đề xuất bởi Scott Gutherie, vì vậy tôi sẽ phải đồng ý.
Simon Fox

@Simon Fox - có liên kết đến đề xuất của scottgu? Không thể tìm thấy nó.
orip


Lấy làm tiếc. Có một chút khó khăn để hiểu một phần của điều này. Hàm tạo cho bộ điều khiển được chuyển qua một phiên bản của IViewDataFactory nhưng hệ thống đang mong đợi một hàm tạo không tham số. Tôi cũng không quen với cú pháp C # đó (cụ thể là "MasterViewData, new ()") cho giao diện. Ai đó có thể vui lòng giải thích nó hoặc chỉ cho tôi một nguồn tốt. Cảm ơn.
Jason

5
Tôi thích có các mô hình được đánh máy mạnh để làm việc, nhưng tôi không phải là người thích kết hợp dữ liệu chính với tất cả các mô hình và hành động khác của tôi. Nhảy vào chủ đề này hơi muộn, nhưng tôi đã đăng cách tiếp cận của mình để làm chủ dữ liệu giúp mọi thứ trở nên lỏng lẻo hơn.
Todd Menier

59

Tôi thích chia nhỏ các phần theo hướng dữ liệu của chế độ xem chính thành các phần và hiển thị chúng bằng Html.RenderAction . Điều này có một số lợi thế khác biệt so với cách tiếp cận kế thừa mô hình chế độ xem phổ biến:

  1. Dữ liệu chế độ xem chính được tách hoàn toàn khỏi các mô hình chế độ xem "thông thường". Đây là thành phần thay vì kế thừa và dẫn đến một hệ thống được kết hợp lỏng lẻo hơn, dễ thay đổi hơn.
  2. Các mô hình chế độ xem chính được xây dựng bởi một hành động bộ điều khiển hoàn toàn riêng biệt. Các hành động "thông thường" không cần phải lo lắng về điều này và không cần nhà máy sản xuất dữ liệu chế độ xem, điều này có vẻ quá phức tạp đối với thị hiếu của tôi.
  3. Nếu bạn tình cờ sử dụng một công cụ như AutoMapper để ánh xạ miền của bạn với các mô hình chế độ xem, bạn sẽ thấy dễ dàng định cấu hình hơn vì các mô hình chế độ xem của bạn sẽ gần giống với các mô hình miền của bạn hơn khi chúng không kế thừa dữ liệu chế độ xem chính.
  4. Với các phương pháp hành động riêng biệt cho dữ liệu chính, bạn có thể dễ dàng áp dụng bộ nhớ đệm đầu ra cho các vùng nhất định của trang. Thông thường, chế độ xem chính chứa dữ liệu thay đổi ít thường xuyên hơn nội dung trang chính.

3
+1. Một ưu điểm khác là bạn có thể có cùng một chế độ xem sử dụng các trang chính khác nhau tùy thuộc vào trạng thái thời gian chạy hiện tại.
StriplingWarrior

1
Tôi rất thích câu trả lời này - các cách tiếp cận khác được nêu có vẻ hơi phức tạp.
Paddy

2
Đây là giải pháp thanh lịch nhất theo ý kiến ​​của tôi.
autatt

1
Giải pháp này có vẻ tốt nhất đối với tôi. Cảm ơn rất nhiều!
JimDaniel

1
Đây là một cách tuyệt vời, nhưng hãy nhớ rằng bạn vẫn phải chỉ định các tuyến đường cho "các hành động từng phần" của mình. Xem câu trả lời này stackoverflow.com/a/3553617/56621
Alex

20

BIÊN TẬP

Lỗi Chung đã cung cấp một câu trả lời tốt hơn bên dưới. Hãy đọc nó!

Câu trả lời gốc

Microsoft đã thực sự đăng một mục về cách "chính thức" để xử lý việc này. Điều này cung cấp hướng dẫn từng bước với giải thích về lý do của họ.

Tóm lại, họ khuyên bạn nên sử dụng một lớp bộ điều khiển trừu tượng, nhưng hãy tự mình xem.


CẢM ƠN BẠN! Ví dụ đó là CHÍNH XÁC những gì tôi đang làm ... danh mục trên mọi trang đến từ cơ sở dữ liệu.
Martin

Scott Gutherie, một trong những tác giả của MVC đề xuất giải pháp được cung cấp bởi @Generic Error bên dưới
Simon Fox

1
+1 để hướng dẫn đến câu trả lời tốt nhất ngay cả khi câu trả lời của bạn chính thức đúng và được OP chấp nhận là câu trả lời.
IsmailS

+1 để hướng dẫn đến câu trả lời tốt nhất ngay cả khi câu trả lời của bạn chính thức đúng và được OP chấp nhận là câu trả lời.
Dave Jellison

Trên thực tế, Todd Menier hiện là câu trả lời tốt nhất cho điều này.
andreialecu

7

Bộ điều khiển trừu tượng là một ý tưởng hay và tôi chưa tìm ra cách nào tốt hơn. Tôi cũng muốn xem những người khác đã làm gì.



2

Tôi thấy rằng một phụ huynh chung cho tất cả các đối tượng mô hình mà bạn chuyển đến dạng xem là đặc biệt hữu ích.

Dù sao thì sẽ luôn có một số thuộc tính mô hình chung giữa các trang.


0

Đối tượng Request.Params có thể thay đổi. Khá dễ dàng để thêm các giá trị vô hướng vào nó như một phần của chu trình xử lý yêu cầu. Từ quan điểm của chế độ xem, thông tin đó có thể đã được cung cấp trong Chuỗi truy vấn hoặc BÀI ĐĂNG MẪU. hth


0

Tôi nghĩ rằng một cách tốt khác có thể là tạo Giao diện cho chế độ xem với một số Thuộc tính như ParentView của một số giao diện, vì vậy bạn có thể sử dụng nó cho cả các điều khiển cần tham chiếu đến trang (điều khiển chính) và cho các chế độ xem chính cần được truy cập từ lượt xem.


0

Các giải pháp khác thiếu sang trọng và mất quá nhiều thời gian. Tôi xin lỗi vì đã làm điều rất buồn và nghèo nàn này gần cả năm sau đó:

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

Vì vậy, rõ ràng tôi có phương thức tĩnh Get () này trên SiteMasterViewData trả về SiteMasterViewData.


đối với nhiều người, điều này có vẻ hơi hack hoặc 'ô uế' nhưng nó hoàn thành công việc một cách nhanh chóng
argh

Ặc. Mã của bạn có vẻ khó khăn hơn nhiều để duy trì điều đó nếu bạn đã sử dụng Html.RenderAction ().
Dan Esparza
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.