2016-02-27 3 views
0

Я хотел бы взять модель таблицы и создать модель с полями дополнений, а затем заполнить ее как представление. Как это сделать в контроллере? Когда это была только модель, она работала, но я не уверен, как сделать то же самое, когда это viewmodel. Я новичок в asp.net mvc, поэтому любая помощь будет оценена по достоинству.Использование Viewmodel для заполнения данных sql и добавления столбцов

Модель:

 public partial class tblTag 
     { 
      public int TagId { get; set; } 
      public string TagName { get; set; } 
     } 

ViewModel:

public class tblTagViewModel 
{ 
    public string TagName { get; set; } 

    public string TagNameClr 
    { 
     get 
     { 
      if (TagName == "Test") 
      { 
       return "green"; 
      } 
      else 
      { 
       return "red"; 
      } 
     } 
    } 
} 

Контроллер:

Не может неявно преобразовать тип 'System.Data.Entity.DbSet < _1MvcSqlServer.Models.tblTag>' to '_1MvcSqlServer.ViewModel.tblTagViewModel'

Теперь, когда это viewmodel, структура из объектов отличается, я предполагаю, что это проблема. Как это разрешить?

private testEntities db = new testEntities(); 

public ActionResult Test() 
{ 
     ViewModel.tblTagViewModel model = new ViewModel.tblTagViewModel(); 
     model = db.tblTags; 
     return(model); 
} 

Вот что я получил, чтобы заставить его работать. Это правильный метод?

 public ActionResult Test() 
    { 
     List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>(); 
     var model = new ViewModel.tblTagViewModel(); 
     foreach(tblTag p in db.tblTags) 
     { 
      ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel(); 
      nw.TagName = p.TagName; 
      list.Add(nw); 
     } 

     return View(list); 
    } 
+0

Ваш последний фрагмент кода в порядке, хотя его можно упростить до 'var list = db.tblTags.Select (t => new tblTagViewModel {TagName = t. TagName}) ToList(); return View (list); ' –

+0

Спасибо, что я искал! Я знал, что это просто. –

ответ

0

Правильный метод - создать бизнес-слой, который будет получать данные из слоя БД и передавать эти данные для просмотра слой (и наоборот, получить данные из View слоя и переходим к слою БД).

Кроме того, я рекомендую посмотреть на IoC (DI) подход:

Бизнес слой:

Сначала на всех, вы создаете новый ClassLibrary проект и создать бизнес-уровня классов POCO и абстракцией вашего репозиторий:

/// <summary> 
/// this is a Business layer class, which is very similar on EF class 
/// </summary> 
public class Tag 
{ 
    public int TagId { get; set; } 
    public string TagName { get; set; } 
} 

public interface IRepository 
{ 
    List<Tag> GetTagList(); 
} 

Затем создается служба:

public class Service 
{ 
    private readonly IRepository _repository; 
    public Service(IRepository repository) 
    { 
     if (repository == null) 
      throw new ArgumentNullException("repository"); 

     _repository = repository; 
    } 
    public List<Tag> GetTagList() 
    { 
     return _repository.GetTagList(); 
    } 
} 

На этом этапе вы скомпилировали версию бизнес-уровня. Вы можете добавить всю сложную логику своего приложения и протестировать ее. Внимательно, без DB amd Просмотр деталей!

Следующий шаг - создать слой DB

DB Layer:

Создать еще одну библиотеку классов в вашем решении, добавьте ссылку на проект BL и добавить такой код:

public class EFRepository : IRepository 
{ 
    private ... _db; 
    public EFRepository() 
    { 
     ..... 
    } 
    public List<Tag> GetTagList() 
    { 
     var tags = (from i in _db.tblTags select new Tag { TagId = i.TagId, TagName = i.TagName }).ToList(); 
    } 
} 

поэтому у вас есть уровни БД и БЛ. И ваш уровень BL не зависит от уровня БД, наоборот, уровень БД зависит от уровня BL. И это правильный подход, бизнес-логика вашего приложения не должна зависеть от БД!

Последний шаг - Вид слоя.

Просмотр слой

Вы можете отделить Просмотр слой к другому проекту тоже. Я делаю это в своем приложении ASP.NET MVC. Добавить ссылки на БД и BL проекты

public class tblTagViewModel 
{ 
    public string TagName { get; set; } 

    public string TagNameClr 
    { 
     get 
     { 
      if (TagName == "Test") 
      { 
       return "green"; 
      } 
      else 
      { 
       return "red"; 
      } 
     } 
    } 
} 

и контроллер:

public class HomeController : Controller 
{ 
    private readonly Service _service; 
    public HomeController(IRepository repository) 
    { 
     if (repository == null) 
      throw new ArgumentNullException("repository"); 
     _service = new Service(repository); 
    } 


    public ActionResult Test() 
    { 
     List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>(); 
     vat taglist = _service.GetTagList(); 
     foreach (tblTag p in taglist) 
     { 
      ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel(); 
      nw.TagName = p.TagName; 
      list.Add(nw); 
     } 

     return View(list); 
    } 
} 

и, последний шаг, установить реализацию DB для вашего веб-приложения:

public class MyControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     var efRepository = new EFRepository(); 
     if (controllerType == typeof(HomeController)) 
     { 
      return new HomeController(efRepository); 
     } 

     return base.GetControllerInstance(requestContext, controllerType); 
    } 

обращают внимание, что ваше веб-приложение не зависит от уровня БД, оно зависит только от BL-слоя (это тоже логично). Только одно место для установки EFRepository в вашем веб-приложении - на контроллере.

При таком подходе вы можете легко изменить EFRepository на другую реализацию IRepository, с другой БД или даже поддельной БД. Вы можете протестировать любую часть вашего приложения без ненужных отношений. У вас есть сильная и правильная архитектура, где ваше приложение зависит от уровня бизнес-логики и не зависит от уровня БД и т. Д. Любые изменения в уровне БД или уровне Света не влияют на логический уровень

Для сопоставления аналогичных классов POCO (например, BL и DB, BL и View) со многими свойствами, которые вы можете использовать Automapper

+0

Спасибо, это будет очень полезно для меня, чтобы понять хорошую структуру и взломать что-то вместе только потому, что она работает. Просто начинаю, я позволяю инфраструктуре сущности делать все для моих таблиц, и я знаю, что мне нужно будет узнать о том, что там происходит, чтобы иметь возможность делать что-то правильно. –

+0

@curiousgeorge Я рекомендую вам прочитать эту книгу: https://www.manning.com/books/dependency-injection-in-dot-net –

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