2013-07-25 44 views
6

我有一個基本模型類NotificationBase和兩個派生模型GeneralNotification和ReleaseNotification。使用派生的mvc模型的單個視圖

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; } 
} 

我試圖使用單個編輯視圖來編輯派生的通知類型。

此視圖有一個NotificationBase類型的模型。

問題是我無法獲得要在編輯視圖中顯示的派生類型的添加屬性。發送基類型的模型意味着我沿途失去了派生類型的額外屬性。

是否有解決方法,或者我只需爲每個派生模型分別創建視圖?

回答

4

您可以添加一些條件到您的視圖。假設你的看法是強類型與基類:

@model NotificationBase 

您可以檢查每個子類,並添加相應的字段(以下未測試的代碼!):

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

也是一樣的,當然第二個亞型:

​​
+0

謝謝你的快速回應,Andrei。這正是我正在做的,問題是這是一個編輯視圖,我需要顯示選定的實體屬性。對於GeneralNotification模型,我需要顯示Message屬性的值。這是我無法傳遞給我的觀點的價值。 –

+0

@OctavianEpure,你如何將模型傳遞給視圖?你能分享一個這樣的代碼示例嗎?理論上,在上面的答案中運行'return View(generalNotificationInstance)'和片段應該會給你一個預期的結果。 – Andrei

+0

這是我傳遞給視圖@model NotificationBase的模型,並在控制器中執行此操作NotificationBase model = null; switch(typeId) case(int)NotificationType.General: model = Service。GetGeneralNotification(ID); 休息; case(int)NotificationType.Release: model = Service.GetReleaseNotification(id); 休息; } return View(model); –

0

這也可以通過使用接口來解決。例如,如果你想避免你的意見條件。 Razor視圖也可以通過界面進行強類型化。

您可以使用NotificationBase實現的完整接口以及派生類中的覆蓋。 (注意NotificationBase需要爲此抽象)或者你實現部分接口。

0

設置模型類型爲基本類型:

@model NotificationBase 

然後:

@Html.EditorForModel() 

EditorForModel足夠智能,基於運行時傳遞的具體類型來呈現形式。

+0

我無法使用EditorForModel,因爲我需要爲StarDate和EndDate字段顯示特殊的JAvaScript日期時間編輯器 –

+1

這正是'EditorTemplates'的用途。 ('〜/ Views/Shared/EditorTemplates/DateTime.cshtml')或者用'[UIHint(「JsDateTime」查看/共享/ EditorTemplates/JsDateTime.cshtml'。 – haim770

0

問題解決:我傳遞給視圖一個特定的派生類型模型(GeneralNotification/ReleaseNotification)而不是傳遞一個基類型模型。這個觀點現在仍然保持着同樣的運作。

+0

但是,如何編輯剃鬚刀頁面的額外屬性,你是否使用基本剃鬚刀語法像@ Htlm.Textbox(「propName」,propValue) – TypingPanda

+0

我想我從@Andrei下面得到了答案。謝謝 – TypingPanda

相關問題