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.
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.
Câu trả lời:
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.
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:
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.
Tôi đã thực hiện một số nghiên cứu và xem qua hai trang web này. Có lẽ họ có thể giúp.
ASP.NET MVC Mẹo # 31 - Truyền dữ liệu đến các trang chính và điều khiển của người dùng
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.
Đố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
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.
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.