2012-06-26 35 views
7

chúng ta hãy xem xét hai quan điểm mà sử dụng cách bố trí tương tự gồm:Asp.Net MVC bố trí và một phần quan điểm

  • Một cột bên trái chứa một "cơ thể" (được điền khác nhau bởi cả hai lượt xem)
  • Một cột bên phải hiển thị thông tin chung (được truyền qua mô hình)

Thay vì xác định đúng phần hai lần, tôi tự hỏi liệu mình có thể tạo một phần Xem trực tiếp từ trang bố cục hay không.

Vấn đề là lượt xem một phần ngầm kế thừa các mô hình của họ từ chế độ xem đang được hiển thị. Và vì mỗi chế độ xem có mô hình riêng của mình, tôi kết thúc với kiểu mô hình không khớp trong chế độ xem một phần.

Từ đây tôi thấy hai giải pháp:

  • tôi có thể chèn một phần chung của mô hình điểm trong ViewBag. Thật không may điều này có nghĩa là mỗi chế độ xem sử dụng bố cục này phải triển khai "quy ước" này nhưng không có gì cảnh báo cho nhà phát triển về nó tại thời điểm biên dịch ...
  • Tôi có thể sử dụng đa hình để làm cho mỗi mô hình xem kế thừa từ cùng một lớp cơ sở : hoặc giao diện) mà Chế độ xem một phần sử dụng. Điều này sẽ làm việc lên đến một mở rộng nhất định nhưng có khả năng tăng theo cấp số nhân phức tạp ngay sau khi tôi có một cái nhìn một phần thứ hai trong cùng một bố trí.

Vì vậy, đây là những câu hỏi sau:

  • Tôi có đúng với các giả định trên?
  • Bạn có thấy bất kỳ khả năng nào khác không?
  • Bất kỳ trở lại nào về trải nghiệm này?

Cảm ơn rất nhiều, TB.

+0

Circa 2017, bạn cũng có thể biến phần chung thành thuộc tính của từng mô hình và sau đó chuyển mô hình đó thành mô hình '@ Html.RenderPartial' – jpaugh

Trả lời

7

Sử dụng Interface và triển khai trên hai mô hình, đây chính là loại điều mà chúng được sử dụng.

Dưới đây là ví dụ về hai Chế độ xem khác nhau sử dụng hai Mô hình khác nhau mà cả hai đều triển khai giao diện. Đây là subtyping thay vì ad-hoc polymorphism.

public class ViewModelOne : IReusableView 
{ 
    public string Name { get; set; } 
    public string Something { get; set; } 
    public int ANumber { get; set; } 
} 

public class ViewModelTwo : IReusableView 
{ 
    public string Name { get; set; } 
    public string Thing { get; set; } 
    public string SomethingElse { get; set; } 
    public int ANumber2 { get; set; } 
} 

public interface IReusableView 
{ 
    string Name { get; } 
} 

Vì vậy, chúng tôi có xem một phần thực sự đơn giản ở đây có nghĩa là 'InnerPartialView':

@model TestIntegration.Models.IReusableView 
<div> 
    @Model.Name 
</div> 

nào được sử dụng trong nhà và về các trang ví dụ điều khiển này:

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 

      return View(new ViewModelOne() { Name = "hello", Something="sdfsdfs", ANumber = 1 }); 
     } 

     public ActionResult About() 
     { 
      return View(new ViewModelTwo() { Name = "hello 2", SomethingElse = "aaaddd", ANumber2 = 10, Thing="rand" }); 
     } 
    } 

Chế độ xem nhà:

@model TestIntegration.Models.ViewModelOne 
@{ 
    ViewBag.Title = "Home Page"; 
} 

<h2>@ViewBag.Message</h2> 
<p> 
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. 
    @Html.Partial("InnerPartialView") 
</p> 

Các khoảng view:

@model TestIntegration.Models.ViewModelTwo 
@{ 
    ViewBag.Title = "About Us"; 
} 

<h2>About</h2> 
<p> 
    Put content here. 
     @Html.Partial("InnerPartialView") 
</p> 
+0

Đây là ý tôi với" baseclass ". Tôi chỉ sợ rằng một khi tôi nhận được nhiều lượt xem một phần, các mô hình khung nhìn của tôi phát triển khá nhanh trong sự phức tạp, thực hiện giao diện này hoặc giao diện tùy thuộc vào ngữ cảnh. Tôi đoán đó là tốt hơn so với thay thế tôi đề cập đến, nhưng tôi ngạc nhiên không tìm thấy bất kỳ thực hành tốt nhất ở đây ... –

+0

Một lớp cơ sở và giao diện rất khác nhau. Tôi đã cập nhật với một ví dụ đầy đủ vì không có gì phức tạp về điều này. Đừng đi quá mức với điều này, nếu bạn đang thêm một trình đơn, ví dụ, bạn sẽ không đặt nó trong ViewModel, bạn sẽ vượt qua điều đó trong bộ điều khiển bằng cách sử dụng viewbag và xử lý trong trang bố trí. Phương pháp này nên được sử dụng cho chức năng mà bạn muốn sử dụng lại trên các đối tượng, không phải cho những thứ như footers, menu hoặc sidebars. – mattmanser

+0

Vì bạn nói khung bên phải là để hiển thị thông tin "chung", điều này ngụ ý rằng nó hiển thị thông tin khá chung chung, do đó, nó sẽ không phụ thuộc quá nhiều vào phân lớp chi tiết. Bạn đã không nói nhiều về miền ứng dụng của bạn, vì vậy thật khó để nói. Ví dụ, nếu đó là một trang web cho công thức nấu ăn, bạn mong đợi mọi công thức (không phân biệt lớp con) có một vài thuộc tính chung (tiêu đề, sản lượng, thời gian nấu) và chúng có thể được thể hiện trong Giao diện. Nếu trang web của bạn đang xử lý các loại đa dạng rộng rãi và không có điểm gì chung thì có thể không có bất kỳ thông tin "chung" nào để hiển thị –

3

Khi bạn làm cho xem một phần, bạn có thể gửi một mô hình:

@Html.RenderPartial(MVC.Partials.Views.Sidebar, Model.SideBarModel); 

Vì vậy, bạn có thể gửi xuống dữ liệu như là một phần của mô hình mẹ đó là mô hình cho thanh bên một phần.

+0

Điều đó sẽ hiệu quả nếu tôi biết mô hình là gì. Vì tôi đang thực hiện RenderPartial này trong layout, mô hình của tôi có thể là bất cứ thứ gì. Trừ khi tôi có một baseclass chung hoặc giao diện cho tất cả các mô hình của tôi, tôi không thể giả định bất cứ điều gì về họ. –

0

Ở chế độ xem một phần, các kiểu là loại dynamic do đó bạn không cần phải biết chúng là loại nào. Tuy nhiên, bạn chỉ cần đảm bảo mô hình có thuộc tính bạn cần. Nói cách khác, bạn có thể sử dụng Model.MyProperty hoặc Model.MyProperty làm MyPropertyType khi sử dụng Html.Partial.

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