2015-04-12 5 views
0

Я хочу использовать модель представления для отображения вместо модели домена. У меня есть эти вид модели классов:Объект модели домена для просмотра объекта модели в MVC

public class ArticleDescriptionViewModel 
{ 
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

public class HomePage 
{ 
    public List<ArticleDescriptionViewModel> Articles { get; set; } 
} 

В модели домена я получил:

public class ArticleDescription 
{  
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

и этот метод обслуживания:

public List<ArticleDescription> GetArticlesDescription() 
{ 
    var articleDescription= from a in _ctx.Articles 
          select new ArticleDescription 
          { Title = a.Title, DateCreated = a.DateCreated }; 
    return articleDescription.ToList(); 
} 

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

public ActionResult Index() 
{ 
    HomePage HomePageInstance = new HomePage(); 
    HomePageInstance.Articles = _repo.GetArticlesDescription(); 
    return View(HomePageInstance); 
} 

Я получил сообщение об ошибке:

"Cannot implicitly convert type System.Collections.Generic.List (DBayonaCode.Domain.Services.Models.ArticleDescription)' to 'System.Collections.Generic.List(DBayonaCode.Models.ArticleDescriptionViewModel)'"

Но эти два класса эквивалентны? Я делаю что-то неправильно. Я ценю вашу помощь?

+0

Оба класса ** не эквивалентны **, они могут иметь одинаковые имена имен свойств, но они не являются одними и теми же классами. Вам нужно преобразовать 'ArticleDescription' в' ArticleDescriptionViewModel'. Используйте linq '.Select (x => new ArticleDescriptionViewModel() {...' или посмотрите на использование таких инструментов, как [automapper] (http://automapper.codeplex.com/) –

+0

Спасибо за ваш ответ. cheack Automapper option, однако остается один вопрос: хорошо ли это, что я здесь делаю, пытаясь разобраться в проблемах ?, вы знаете, я мог бы сделать ссылку на мой класс домена в своем контроллере, чтобы создать список типов , чтобы получить результаты, и все. Мне не нужно было сопоставлять эти два класса (класс домена - класс вида). Есть ли другой лучший подход? – user3007593

+0

Вы правильно подходите. Контроллер отвечает за получение данных модель (ы) из службы и сопоставление ее с моделью просмотра. Хотя вы можете использовать модель домена в представлении, всегда лучше использовать модель представления для отображения/редактирования только того, что вы хотите, для применения атрибутов проверки и т. д. –

ответ

0

ArticleDescription и ArticleDescriptionViewModel - два разных типа, поэтому между ними нет неявного преобразования. Вам необходимо нанести на карту объект модели домена на ваш Просмотреть объект модели, вы можете сделать это вручную или с помощью инструмента, такого как AutoMapper.

Вы можете написать методы расширения, как это сделать отображение:

public static class Mappings 
{ 
    public static ArticleDescriptionViewModel ConvertToView(this ArticleDescription article) 
    { 
     // Mapping Code 
     // return new ArticleDescriptionViewModel { ... } 
    } 

    public static List<ArticleDescriptionViewModel> ConvertToViews(this List<ArticleDescription> articles) 
    { 
     List<ArticleDescriptionViewModel> articleViews = new List<ArticleDescriptionViewModel>(); 

     foreach (ArticleDescription article in articles) 
     { 
      articleViews.Add(article.ConvertToView()) 
     } 
     return articleViews; 
    } 
} 
+0

Благодарим вас за ответ. Он работает отлично. однако остается один вопрос: хорош ли подход к тому, что я здесь делаю, пытаясь разобраться в проблемах ?, вы знаете, я мог бы ссылаться на мой класс домена в своем контроллере, чтобы создать список типов <мой класс домена> для получить результаты и все. Мне не нужно было сопоставлять эти два класса. (класс класса - класс просмотра). Есть ли другой подход? – user3007593

+0

Рекомендуется использовать Модели для просмотра по многим причинам, но главным образом потому, что он держит вашу модель домена в чистоте, сохраняя такие проблемы, как валидация, презентационная логика, форматирование данных в моделях просмотра и отдельно от объектов вашего домена, кроме того, они предотвращают [чрезмерную публикацию атаки] (http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx). Таким образом, я не думаю, что есть лучший подход к передаче данных между вашими контроллерами и представлениями. – chomba

0

Хотя папку MVC шаблон проекта по умолчанию предлагают только один модель, таким образом, косвенно представляя идею, что модели являются одна вещь, на самом деле Есть три типы данных, потенциально вовлеченные в приложение ASP.NET MVC:

- Domain model objects will be passed from and to a middle tier services interfacing with databases. 

- View Model objects are those that the Controller pass to the View. 

- Input model objects are those that the default modelBinder or some custom modelBinder generates from the view, although in many cases the input models are the same view model objects. 

Надеюсь, это поможет.

+0

Благодарим вас за ответ. остается один вопрос: хорошо ли я понимаю, что я здесь делаю, пытаясь разобраться в проблемах ?, вы знаете, я мог бы ссылаться на мой класс домена в своем контроллере, чтобы создать список типов <мой класс домена> для получения результаты и все. Мне не нужно было сопоставлять эти два класса. (класс класса - класс просмотра). Есть ли другой подход? – user3007593

+0

Наличие моделей, отличных от модели домена, в ваших интересах. Разделяя данные таким образом, что вы можете делать DataAnnotations в своих моделях ViewModels, которые не имеют отношения к моделям Домен и поэтому используют ModelState.IsValid в [httpPost], также ваш объект домена может содержать свойства, заполненные данными, созданными на стороне бизнес-логики вашего приложения и не генерируются пользовательским вводом и, наконец, не в последнюю очередь модели домена могут содержать данные, которые не должны отображаться для пользователя. –

+0

Спасибо. Теперь ясно. Я действительно ценю твою помощь. – user3007593

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