Кажется, у меня запуталась странная проблема, и после нескольких часов царапин на голове я, кажется, сузил проблему до комбинации частичных классов и виртуальные свойства. Когда я переопределяю свойство, которое в частичном классе, сидя в отдельном файле, MVC дублирует поля в моем представлении. Я использую Visual Studio 2013, и проблему можно дублировать, выполнив следующие шаги:
- Откройте Visual Studio и создайте новый проект. Выберите "Веб" под категориями, затем выберите "Веб-приложение ASP.NET". Я нацелен на .NET 4.5.
- Выберите "Пусто" из выбора шаблона, затем установите флажок MVC, чтобы он добавлял основные папки и ссылки.
- Как только проект будет создан, щелкните правой кнопкой мыши по папке
Models
и создайте новый класс под названиемMyModel.cs
.
Добавьте эти строки в новый файл:
public abstract partial class MyOriginalModel
{
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public partial class MyModel : MyOriginalModel
{
}
- Теперь щелкните правой кнопкой мыши по папке
Models
и создайте еще один новый класс под названиемMyModelCustom.cs
.
Добавьте эти строки в файл:
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;
}
}
}
- Теперь создайте проект, затем щелкните правой кнопкой мыши по папке
Controllers
и добавьте новый контроллер. Выберите "Контроллер MVC 5 с действиями чтения/записи" и назовите егоNamesController
. Щелкните правой кнопкой мыши на методе "Создать" и перейдите к "Добавить вид". В раскрывающемся списке шаблонов выберитеCreate
и для раскрывающегося списка Модель-класс выберитеMyModel
.
Как только MVC создаст шаблон, вы увидите, что он добавляет First Name
и Last Name
дважды. Проблема, похоже, связана с частичными классами, потому что, если я перемещаю содержимое MyModelCustom.cs
в MyModel.cs
, все работает нормально. Однако это не просто частичные классы. Если я создаю новое свойство (по сравнению с перегрузкой) в частичном классе, он не дублирует это свойство. Таким образом, это, кажется, комбинация частичных классов и переопределение виртуальных свойств.
Может кто-нибудь, пожалуйста, подтвердите, является ли это ошибкой или если я что-то делаю неправильно?