使用单个视图导出mvc模型

我有一个基本模型类NotificationBase和两个派生模型,GeneralNotification和ReleaseNotification。

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类型的模型。

问题是我无法获得要在编辑视图中显示的派生类型的添加属性。 发送基类型的模型意味着我失去了派生类型的额外属性。

有没有解决方法,或者我只需要为每个派生模型制作单独的视图?

您可以在视图中添加几个条件。 假设您的视图是使用基类强类型的:

 @model NotificationBase 

您可以检查每个子类并添加相应的字段(下面未经测试的代码!):

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

第二个子类型当然也是如此:

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

这也可以通过使用接口来解决。 例如,如果您想避免视图中的条件。 Razor视图也可以通过界面强类型化。

您可以使用NotificationBase实现的完整界面,并在派生类中进行覆盖。 (请注意,NotificationBase需要为此抽象)或者您实现部分接口。

将模型类型设置为基本类型:

 @model NotificationBase 

然后:

 @Html.EditorForModel() 

EditorForModel足够聪明,可以根据在运行时传递的具体类型呈现表单。

问题解决了:我向视图传递了一个特定的派生类型模型(GeneralNotification / ReleaseNotification),而不是传递基类型模型。 视图保持不变,并且现在正在进行着作品。