2013-07-25 24 views
6

Tôi có lớp mô hình cơ sở, NotificationBase và hai mô hình có nguồn gốc, GeneralNotification và ReleaseNotification.Sử dụng chế độ xem đơn cho các mô hình mvc bắt nguồn

public class NotificationBase 
{ 
     public int Id { get; set; } 

     [Required] 
    [StringLength(50, ErrorMessage="Title must not exceed 50 characters.")] 
    public string Title { get; set; } 

    [Required(ErrorMessage="Type is required.")] 
    public int TypeId { get; set; } 

    [Required(ErrorMessage="Importance is required.")] 
    public int ImportanceId { get; set; } 

    public DateTime Created {get; set; } 

    [Required(ErrorMessage="Start date is required.")]   
    public DateTime StartDate { get; set; } 

    [Required(ErrorMessage="End date is required")] 
    public DateTime EndDate { get; set; } 

    [AllowHtml] 
    [Required(ErrorMessage="Details are required")] 
    public string Details { get; set; }     

} 

public class GeneralNotification : NotificationBase 
{ 
    [Required(ErrorMessage="Message is required.")] 
    [StringLength(50, ErrorMessage = "Message must be maximum 50 chararacters long.")] 
    public string Message { get; set; } 
} 

    public class ReleaseNotification : NotificationBase 
{ 
    [Required(ErrorMessage="Version is required.")] 
    public string Version { get; set; } 
} 

Tôi đang cố sử dụng một chế độ xem chỉnh sửa để chỉnh sửa cả hai loại thông báo có nguồn gốc.

Chế độ xem này có kiểu mô hình là NotificationBase.

Vấn đề là tôi không thể nhận được các thuộc tính bổ sung của các loại dẫn xuất được hiển thị trong chế độ xem chỉnh sửa. Gửi một mô hình của kiểu cơ sở có nghĩa là tôi mất đi theo cách các thuộc tính phụ của các kiểu dẫn xuất.

Có cách nào khác không, hoặc tôi chỉ phải thực hiện các chế độ xem riêng biệt cho từng mô hình có nguồn gốc?

Trả lời

4

Bạn có thể thêm một vài điều kiện vào chế độ xem của mình. Giả sử xem của bạn được gõ mạnh với lớp cơ sở:

@model NotificationBase 

Bạn có thể kiểm tra cho mỗi lớp và thêm các trường tương ứng (mã chưa được kiểm tra dưới đây!):

@if (Model is GeneralNotification) 
{ 
    Html.TextBoxFor(m => ((GeneralNotification) m).Message); 
} 

Cũng vậy với kiểu phụ thứ hai của khóa học:

@if (Model is ReleaseNotification) 
{ 
    Html.TextBoxFor(m => ((ReleaseNotification) m).Version); 
} 
+0

Cảm ơn bạn đã phản hồi nhanh, Andrei. Đó là chính xác những gì tôi đang làm, vấn đề là đây là một cái nhìn chỉnh sửa và tôi cần phải hiển thị các thuộc tính thực thể được chọn. Đối với mô hình GeneralNotification, tôi cần hiển thị giá trị của thuộc tính Message. Đó là giá trị này tôi không thể vượt qua để xem của tôi. –

+0

@OctavianEpure, bạn chuyển mô hình đến chế độ xem như thế nào? Bạn có thể chia sẻ một mẫu mã này không? Trong lý thuyết chạy 'return View (generalNotificationInstance)' cùng với các đoạn trong câu trả lời ở trên sẽ cho bạn một kết quả mong đợi. – Andrei

+0

đây là mô hình tôi vượt qua để xem @model NotificationBase, và trong bộ điều khiển tôi làm mô hình NotificationBase = null; công tắc (loạiId) { trường hợp (int) NotificationType.General: model = Dịch vụ.GetGeneralNotification (id); ngắt; trường hợp (int) NotificationType.Release: model = Service.GetReleaseNotification (id); ngắt; } return View (model); –

0

Điều này cũng có thể được giải quyết bằng cách sử dụng giao diện. Ví dụ: nếu bạn muốn tránh điều kiện trong chế độ xem của mình. Xem dao cạo cũng có thể được gõ mạnh mẽ với một giao diện.

Bạn có thể thực hiện giao diện đầy đủ được thực hiện bởi NotificationBase với ghi đè trong các lớp dẫn xuất của bạn. (lưu ý rằng NotificationBase sẽ cần phải được trừu tượng cho điều này) Hoặc bạn thực hiện một phần giao diện.

Kr

0

Đặt loại mô hình của bạn với các loại cơ sở:

@model NotificationBase 

Sau đó:

@Html.EditorForModel() 

EditorForModel là đủ thông minh để làm cho hình thức dựa trên các loại bê tông thông qua vào thời gian chạy .

+0

Tôi không thể sử dụng EditorForModel, vì tôi cần hiển thị trình soạn thảo datetime JAvaScript đặc biệt để xem cho các trường StarDate và EndDate –

+1

Đây chính xác là những gì 'EditorTemplates' dành cho. hoặc thêm một mẫu soạn thảo 'DateTime' chung (' ~/Views/Shared/EditorTemplates/DateTime.cshtml') hoặc trang trí các thuộc tính 'StartDate' &' EndDate' của bạn với '[UIHint (" JsDateTime ")]' rồi '~/Views/Shared/EditorTemplates/JsDateTime.cshtml'. – haim770

0

Sự cố được giải quyết: Tôi đã chuyển sang chế độ xem mô hình loại có nguồn gốc cụ thể (GeneralNotification/ReleaseNotification) thay vì truyền mô hình loại cơ sở. Quan điểm vẫn giữ nguyên công việc như nhau và bây giờ.

+0

Nhưng làm thế nào để bạn chỉnh sửa các thuộc tính bổ sung trong trang dao cạo, bạn chỉ cần sử dụng cú pháp cơ sở dao cạo như @ Htlm.Textbox ("propName", propValue) – TypingPanda

+0

Tôi nghĩ rằng tôi đã nhận được câu trả lời từ @Andrei bên dưới. Cảm ơn – TypingPanda

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