1

У меня есть модель с определенными свойствами. Я использую отдельный класс с MetadataType для определения требований к свойствам. Я также пытаюсь использовать один и тот же класс метаданных с viewmodel, определяющим только подмножество свойств. Это простой пример кода ситуации для уточнения:Я получаю InvalidOperationException, когда я пытаюсь использовать Metadatatype с viewmodel

[MetadataType(typeof(Metadata))] 
class ModelA 
{ 

    public class Metadata 
    { 
     [Required] 
     public object Property1 { get; set; } 

     [Required] 
     public object Property2 { get; set; } 

    } 

    public int Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

[MetadataType(typeof(ModelA.Metadata))] 
class ViewModelA 
{ 
    public int Property1 { get; set; } 
} 

Проблема заключается в том, когда бритва двигатель пытается обработать вид, она бросает в InvalidOperationException со следующим сообщением об ошибке:

связанных типов метаданных для типа 'ViewModelA' содержит следующие неизвестные свойства или поля: Property2. Убедитесь, что имена этих элементов соответствуют именам свойств основного типа.

В моем понимании проблема здесь в том, что метаданные содержат свойства, которых нет в модели представления. Тем не менее, я действительно не понимаю преимуществ наличия класса метаданных. Так что мои вопросы:

1) Есть ли способ предотвратить выброс этого исключения?

2) Если нет, то какой он лучший образец для этой ситуации? (например, с использованием модели, viewmodel, которая содержит подмножество свойств модели, определяющую аннотации данных, поддерживая подход DRY).

ответ

2

MetadataTypeAttribute обычно используются в тех случаях, когда вы хотите применить метаданные к автоматически сгенерированным объектам. Если бы вы применили метаданные к самим объектам, они были бы перезаписаны при восстановлении объектов.

Обычно это делается с помощью частичных классов. Например, см. Ниже. В этом случае вы создаете пустой частичный класс, который является тем же именем, что и автоматически сгенерированный класс, он, конечно, совпадает с ним, но вы добавляете к нему атрибут MetadataType и включаете в себя вложенный в него класс метаданных.

Обычно вы не используете это для других классов, так как другие классы должны иметь идентичные (или надмножества) свойства.

// Do no edit this class as it is auto generated 
public partial class ModelA 
{ 
    public int Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

// This class can be edited 
[MetadataType(typeof(ModelA.Metadata))] 
public partial class ModelA 
{ 
    public class Metadata 
    { 
     [Required] 
     public object Property1 { get; set; } 

     [Required] 
     public object Property2 { get; set; } 

    } 
} 

Таким образом, чтобы ответить на ваши вопросы:

1) Нет, вы не можете предотвратить исключение, поскольку метаданные для описания всех свойств его родительского класса, и если эти свойства не есть, он бросает.

2) Вам придется создавать альтернативные классы метаданных. Поскольку это такая же работа, как создание автономной модели представления, нет никакой реальной пользы для использования классов друзей для моделей просмотра, которые являются подмножествами.

Многие люди попадают в концепцию СУХОЙ. Проблема в том, что каждая программная реализация имеет конкурирующие требования. DRY часто находится в противоречии с принципом единой ответственности.

MetadataTypeAttribute - это действительно более хакер, чтобы иметь дело с тем, как разработчики генерируют код. Если вы используете Code First, то я бы сильно отказался от использования MetadataTypeAttribute.

+0

Спасибо за ваш ответ. Таким образом, MetadataType предназначен для автоматически генерируемых классов, таких как базовая структура сущностей базы данных. Однако я сначала использую код, поэтому такое решение кажется мне бесполезным.На самом деле я немного смущен, поскольку я видел эту технику в учебнике MVC (http://www.microsoftvirtualacademy.com/training-courses/developing-asp-net-mvc-4-web-applications-jump-start), поэтому я не знаю, почему они даже упомянули об этом. Возможно, я просмотрю видео. – kexx

+0

Я держу вопрос открытым, так как я действительно не понимаю, что вы подразумеваете, создавая альтернативные классы метаданных. Моя цель здесь заключается в использовании аннотаций данных, и автомат валидации относится к ней, а при определении ограничений только одни, поэтому я все еще ищу для этого хорошее решение. – kexx

+0

@kexx - Я имею в виду, задайте альтернативный класс метаданных только с Property1. Который, как я сказал, так же эффективен, как просто наличие автономной модели представления с ее собственными атрибутами данных. Что касается учебника, они, вероятно, сначала использовали его с базой данных сначала или с моделью. –

Смежные вопросы