Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using a single view for derived mvc models

Tags:

c#

asp.net-mvc

I have a base model class, NotificationBase, and two derived models, GeneralNotification and 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; }
}

I'm trying to use a single edit view to edit both derived notification types.

This view has a model of type NotificationBase.

The problem is I can't get the added properties of the derived types to be displayed in the edit view. Sending a model of the base type means I lose along the way the extra properties of the derived types.

Is there a workaround, or I just have to make separate views for each derived model ?

like image 911
Octavian Epure Avatar asked Jul 25 '13 08:07

Octavian Epure


People also ask

Can we have 2 models in a single view?

In MVC we cannot pass multiple models from a controller to the single view.

Can one view have multiple controllers?

Yes, It is possible to share a view across multiple controllers by putting a view into the shared folder. By doing like this, you can automatically make the view available across multiple controllers.

How many views does the model can have in MVC?

ASP.NET MVC view can't have more than one model so if we need to display properties from more than one model in the view, it is not possible.


1 Answers

You can add a couple of conditions to your view. Suppose your view is strongly typed with base class:

@model NotificationBase

You can check for each subclass and add corresponding fields (untested code below!):

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

The same goes for second subtype of course:

@if (Model is ReleaseNotification)
{
    Html.TextBoxFor(m => ((ReleaseNotification) m).Version);
}
like image 61
Andrei Avatar answered Oct 01 '22 19:10

Andrei