2010-09-22 45 views
10

Tôi đã đọc bài đăng của Scott Guthrie trên Passing ViewData from Controllers to Views, nhưng tôi không nghĩ rằng bài học đang nhấp vào cho tình huống cụ thể của tôi.Làm cách nào để vượt qua nhiều mô hình để xem một phần trong ASP.NET MVC

(Lưu ý: Do hạn chế độc quyền của khách hàng, tôi không thể nói chuyện dán đoạn mã thực tế, vì vậy tôi xin lỗi nếu tôi đã lên trường hợp là một chút ngu ngốc/khó hiểu.)

Tôi có một điều khiển được gọi là ScenarioController mà xử lý các hành động khác nhau xoay quanh việc tạo mô hình Kịch bản. Các hành động khác nhau mà người dùng sẽ hoàn thành là CRUD chung của các kịch bản. Tôi có thể tạo một trang web thực hiện điều này cho mô hình Kịch bản. Tuy nhiên, gần đây tôi đã cập nhật mô hình Kịch bản để nó bây giờ được tạo thành từ các thành phần phụ khác nhau (danh sách các đối tượng khác). Khung nhìn tương ứng sử dụng các tab jQuery để tải các khung nhìn một phần, cuối cùng, tải các biểu mẫu tới các dữ liệu thành phần phụ khác nhau. Thật không may, đây là nơi tôi đang gặp rắc rối.

trang Index của tôi hiện trông giống như sau:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 

<% using (Html.BeginForm()) {%> 
    <div id="scenario"> 
     <div id="tabs"> 
      <ul> 
       <li><a href="#tab1">Tab 1</a></li> 
       <li><a href="#tab2">Tab 2</a></li> 
       <li><a href="#tab3">Tab 3</a></li> 
      </ul> 

      <div id="tab1"><% Html.RenderPartial("Tab1"); %></div> 
      <div id="tab2"><% Html.RenderPartial("Tab2"); %></div> 
      <div id="tab3"><% Html.RenderPartial("Tab3"); %></div> 
     </div> 

     <div class="submitButtons"> 
      <input type="button" value="Save Scenario" id="SaveScenario" /> 
      <input type="button" value="Submit Scenario" id="SubmitScenario" /> 
     </div> 
    </div> 
<% } %> 
</asp:Content> 

Và các trang phần đang mạnh mẽ-gõ vào bất cứ điều gì mà họ đại diện (chủ yếu là List<SomeObject>).

Dữ liệu được lưu trữ như thế nào trong mô hình Kịch bản? Tôi đang sử dụng một cơ sở dữ liệu SQL và interfacing với Entity Framework. Tôi vẫn cần các thuộc tính thể hiện các danh mục khác nhau (vì vậy tôi có thể chuyển ViewData sử dụng các lớp được đánh máy mạnh) hay đây là thứ tôi có thể truyền trực tiếp trong ViewData từ các cuộc gọi thực thể (và truyền khi cần)?

Trả lời

4

Bạn có thể chuyển bao nhiêu kiểu tùy thích trong chế độ xem của mình. bạn chỉ cần tạo một mô hình đóng gói có thể chứa tất cả các mô hình 'gửi' của bạn.

bạn cũng có thể sử dụng ViewData nhưng nên sử dụng mô hình.

Ba tab của bạn có cần toàn bộ mô hình hay chỉ một phần của mô hình đó không?

giả sử bạn có 3 mô hình trong mô hình đóng gói của mình. tab1 tab2 tab3 được đặt tên.

như vậy thì bạn có thể gửi mỗi Renderpartial đó là mô hình thích hợp như vậy:

 <div id="tab1"><% Html.RenderPartial("Tab1", Model.tab1); %></div> 
     <div id="tab2"><% Html.RenderPartial("Tab2", Model.tab2); %></div> 
     <div id="tab3"><% Html.RenderPartial("Tab3", Model.tab3); %></div> 

mô hình Encapsulating của bạn sau đó có thể trông giống như

namespace MVCNAMESPACE.Models { 
    public partial class EnCapModel { 
     public List<SomeObject> tab1 { get; set; } 
     public List<SomeObject> tab2 { get; set; } 
     public List<SomeObject> tab3 { get; set; } 
    } 
} 

hy vọng điều này giúp

+0

Đây là con đường tôi lần đầu tiên lấy. Trong trường hợp của Model.tab1, tab1 thực sự là một EntityCollection, vì vậy tôi đang cố gắng làm: Model.tab1.FirstOrDefault() (Tôi không cần bộ sưu tập ngay bây giờ). Tôi nhận được thông báo lỗi cho biết: "Mục mẫu được chuyển vào từ điển là loại 'Kịch bản', nhưng từ điển này yêu cầu một mục kiểu mẫu 'Tab1'." - Có lẽ tôi chỉ đang làm một cái câm? Cảm ơn, @Stefanvds! – JasCav

+0

khi bạn mất 1 (firstordefault) bạn không có một danh sách nhưng chỉ cần 1 mục của kiểu Kịch bản. vì vậy bạn cần phải thay đổi RenderPartial của bạn để có 1 kịch bản, hoặc bạn chỉ cần làm FirstOrDefault bên trong RenderPartial – Stefanvds

+0

Vâng ... Tôi đang làm điều đó. Dưới đây là một phần của tôi xem: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> - Tôi đánh giá cao sự giúp đỡ của bạn ... đây là một vấn đề rất lạ (và bực bội). – JasCav

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