2015-07-14 3 views
1

У меня есть отдельный проект визуальной студии, где я храню свою базу данных (EF6). Итак, мои объекты находятся в пространстве имен Name1 (созданная базой данных Ef6 первых, но упрощенное ниже, для данного примера):свойства и метаданные в базовом классе в разных пространствах имен

namespace Name1 { 

    public class Person 
    { 
     public string FName {get; set;} 
     public string LName {get; set;} 
    } 

} 

Теперь, я создал новый проект MVC 5, и сделал ссылку на данные визуальных Studio, так что я могу получить доступ к объектам. В моем mvc5 проекте я хочу добавить некоторые метаданные в сущности, как это:

namespace NameMvc 
{ 

    [MetadataType(typeof(PersonMetaData))] 
    public class Person : Name1.Person 
    { 

    } 

    public class PersonMetaData 
    { 
     [Display(Name = "Firstname")] 
     public string FName; 
    } 
} 

В мой контроллер я хочу, чтобы все лица, поэтому у меня есть такое действие, как это:

using Name1; 
using NameMvc; 

-- controller class code 
public ActionResult Index() 
{ 
    var persons = db.Person.ToList(); 
    return View(persons); 
} 
-- controller class code 

И на мой взгляд, я пытаюсь получить доступ, что с помощью:

@model IEnumerable<NameMvc.Person> 

Теперь, когда я запускаю код, я получаю сообщение об ошибке:

Элемент модели, переданный в словарь, имеет тип «System.Data.Entity.Infrastructure.DbQuery 1[Name1.Person]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [Name.MvcPerson] '. Я, вероятно, что-то не так сделал в действии, потому что db.Person происходит из пространства имен Name1. То, что я хочу, чтобы использовать метаданные, на мой взгляд, так что, когда я делаю что-то вроде этого:

@Html.DisplayNameFor(model => model.FName) 

Виль привести Firstname

+0

Вы добавили 'Name1'' пространство имен в свой вид? –

+0

@ teo-van-kot Зачем мне это делать? У меня есть ссылка в файле, где я написал свой открытый класс Person: Name1.Person {}. Когда я использую частичный класс в том же пространстве имен, легко добавить файл метаданных, но теперь класс (Name1.Person) находится в другом пространстве имен, где мне не разрешено управлять кодом. – kwv84

ответ

1

Вы получаете ошибку рендеринга ваш взгляд, потому что вы возвращаетесь IEnumerable<Name1.Person> от вашего действия, но ваше мнение ожидает IEnumerable<NameMvc.Person>. Когда вы используете строго типизированную модель в своем представлении, она должна соответствовать модели, возвращенной из действия.

Есть два возможных решения этой ошибки:

  1. изменить вид использования IEnumerable<Name1.Person> в качестве модели или
  2. Изменить свое действие, чтобы возвращать IEnumerable<NameMvc.Person> в качестве модели.

При использовании MetadataType для добавления метаданных к вашей модели наиболее распространенным способом является использование того факта, что исходный класс модели генерируется как частичный класс. Вы создаете еще одну «часть» для частичного класса и добавляете к ней атрибут MetadataType.

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

Чтобы решить эту проблему, вы можете выполнить одно из следующих действий:

  1. Добавить метаданные в сборке вашей модели. Для этого вы используете решение частичного класса в сборке вашей модели. Проблема заключается в том, что вы теперь смешиваете логику представления с логикой данных.
  2. Создайте новый класс в проекте MVC, который является псевдокопией вашей модели данных, чтобы действовать как модель представления. Вы добавляете к нему свои метаданные. Ваше действие вернет эту модель просмотра, и ваше представление будет использовать ее. В своем действии вы копируете данные из своей модели данных в свою модель просмотра.

Я предпочитаю вариант # 2 в течение нескольких причин:

  1. Это решает проблему вы столкнулись, и
  2. Как данные представляются пользователю часто отличается, как я хочу он представлен в моих базах данных. Это сопоставление позволяет мне хорошо справиться с этим.

Недостатком варианта № 2 является повторное копирование данных. Однако для упрощения копирования данных вы можете использовать такие инструменты, как AutoMapper.

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