I seem to be running into a weird issue and after hours of head scratching, I seem to have narrowed the issue down to a combination of partial classes and virtual properties. When I override a property that's in a partial class, sitting in a separate file, MVC duplicates the fields on my view. I am using Visual Studio 2013 and the issue can be duplicated by following these steps:
- Open Visual Studio and create a new Project. Choose Web under the categories, then choose "ASP.NET Web Application". I am targeting .NET 4.5.
- Choose "Empty" from the template selection, then check the MVC checkbox so it adds the core folders and references.
- Once the project is created, right-click on the
Models
folder and create a new class calledMyModel.cs
.
Add these lines to the new file:
public abstract partial class MyOriginalModel
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public partial class MyModel : MyOriginalModel
{
}
- Now right click on the
Models
folder again and create another new class calledMyModelCustom.cs
.
Add these lines to the file:
public partial class MyModel
{
[System.ComponentModel.DisplayName("First Name")]
[System.ComponentModel.DataAnnotations.Required]
public override string FirstName
{
get
{
return base.FirstName;
}
set
{
base.FirstName = value;
}
}
[System.ComponentModel.DisplayName("Last Name")]
[System.ComponentModel.DataAnnotations.Required]
public override string LastName
{
get
{
return base.LastName;
}
set
{
base.LastName = value;
}
}
}
- Now build the project, then right click on the
Controllers
folder and add a new controller. Choose "MVC 5 Controller with read/write actions" and call itNamesController
. Right click on the Create method and go to "Add View". Under the template dropdown, chooseCreate
and for the Model Class dropdown, chooseMyModel
.
Once MVC creates the template, you will see that it adds First Name
and Last Name
twice. The issue seems to be related to partial classes because if I move the contents of MyModelCustom.cs
into MyModel.cs
, everything works fine. However, its not just partial classes. If I create a new property (versus overloading one) in the partial class, it does not duplicate that property. So it seems to be a combination of partial classes and overriding virtual properties.
Can someone please confirm if this is a bug or if I am doing something wrong?