it-swarm-vi.tech

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

Cách truyền dữ liệu của bạn đến Master Page (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 mã bộ điều khiển trừu tượng (bộ điều khiển cơ sở) hoặc lớp cơ sở được truyền cho tất cả các khung nhìn.

102
Łukasz Sowa

Nếu bạn thích các khung nhìn của mình đã gõ mạnh các lớp dữ liệu dạng xem thì nó có thể phù hợp với bạn. Các giải pháp khác có lẽ nhiều hơn chính xác nhưng đây là sự cân bằng tốt đẹp 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 gõ 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ẽ có một lớp dữ liệu chế độ xem được gõ mạnh có chứa thông tin của nó và xuất phát từ dữ liệu 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 kết hợp dữ liệu của các trang chính, tôi gói logic đó vào một nhà máy được truyền cho 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 chủ để xem mối quan hệ tốt, nhưng khi nói đến việc hiển thị các phần/điều khiển người dùng, tôi sẽ kết hợp dữ liệu chế độ xem của họ vào 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 có ý định biên dịch như vậy. Được thiết kế cho ASP.Net MVC 1.0.

77
Generic Error

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

  1. Dữ liệu chế độ xem chính được tách rời hoàn toàn khỏi các mô hình xem "thông thường". Đây là thành phần trên sự kế thừa và dẫn đến một hệ thống kết hợp lỏng lẻo hơn, dễ thay đổi hơn.
  2. Các mô hình khung nhìn chính được xây dựng bằng một hành động đ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 dữ liệu xem, điều này dường như 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ạ tên miền của bạn sang các mô hình xem của bạn, bạn sẽ dễ dàng định cấu hình hơn vì các mô hình xem của bạn sẽ 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 xem dữ liệu tổng thể.
  4. Với các phương thức hành động riêng cho dữ liệu chủ, bạn có thể dễ dàng áp dụng bộ đệm ẩn đầ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.
59
Todd Menier

[~ # ~] chỉnh sửa [~ # ~]

Lỗi chung đã cung cấp câu trả lời tốt hơn bên dưới. Xin vui lòng đọc nó!

Câu trả lời gốc

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

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

20
Michael La Voie

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

7
Ian P
3
David Negron

Tôi thấy rằng một cha mẹ 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.

Luôn luôn có xu hướng một số thuộc tính mô hình chung giữa các trang.

2
Matt Mitchell

Tôi nghĩ rằng một cách tốt khác có thể là tạo Giao diện để 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 cả hai cho 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 nên được truy cập từ lượt xem.

0
dimarzionist

Các giải pháp khác thiếu thanh lịch 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 như 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 này Get () trên SiteMasterViewData trả về SiteMasterViewData.

0
rasx

Đối tượng Request.Params có thể thay đổi. Thật dễ dàng để thêm các giá trị vô hướng vào nó như là một phần của chu trình xử lý yêu cầu. Từ quan điểm của khung nhìn, thông tin đó có thể đã được cung cấp trong QueryString hoặc FORM POST. thứ

0
mtutty