7

我有一个基本模型类 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 类型的模型。

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

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

4

4 回答 4

4

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

@model NotificationBase

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

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

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

@if (Model is ReleaseNotification)
{
    Html.TextBoxFor(m => ((ReleaseNotification) m).Version);
}
于 2013-07-25T08:37:03.607 回答
0

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

@model NotificationBase

然后:

@Html.EditorForModel()

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

于 2013-07-25T08:46:09.120 回答
0

问题已解决:我向视图传递了一个特定的派生类型模型(GeneralNotification/ReleaseNotification),而不是传递一个基本类型模型。视图保持不变,现在一切正常。

于 2013-07-25T09:00:46.993 回答
0

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

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

于 2013-07-25T08:42:27.533 回答