ViewModel Best Practices - PullRequest
       100

ViewModel Best Practices

234 голосов
/ 20 марта 2009

Из этого вопроса , похоже, имеет смысл создать контроллер для ViewModel , который более точно отражает модель, которую пытается отобразить представление, но я Любопытно о некоторых соглашениях (я новичок в паттерне MVC, если он еще не был очевиден).

В основном у меня были следующие вопросы:

  1. Мне обычно нравится иметь один класс / файл. Имеет ли это смысл с ViewModel , если он создается только для передачи данных из контроллера в представление?
  2. Если ViewModel принадлежит в своем собственном файле, и вы используете структуру каталогов / проектов, чтобы отделить вещи, то где находится файл ViewModel ? В каталоге Controllers ?

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

EDIT: Глядя на пример приложения NerdDinner на CodePlex, кажется, что ViewModels являются частью контроллеров , но мне все еще неудобно, что они не находятся в своих собственных файлах.

Ответы [ 11 ]

0 голосов
/ 18 января 2010

код в контроллере:

    [HttpGet]
        public ActionResult EntryEdit(int? entryId)
        {
            ViewData["BodyClass"] = "page-entryEdit";
            EntryEditViewModel viewMode = new EntryEditViewModel(entryId);
            return View(viewMode);
        }

    [HttpPost]
    public ActionResult EntryEdit(Entry entry)
    {
        ViewData["BodyClass"] = "page-entryEdit";            

        #region save

        if (ModelState.IsValid)
        {
            if (EntryManager.Update(entry) == 1)
            {
                return RedirectToAction("EntryEditSuccess", "Dictionary");
            }
            else
            {
                return RedirectToAction("EntryEditFailed", "Dictionary");
            }
        }
        else
        {
            EntryEditViewModel viewModel = new EntryEditViewModel(entry);
            return View(viewModel);
        }

        #endregion
    }

код в модели:

public class EntryEditViewModel
    {
        #region Private Variables for Properties

        private Entry _entry = new Entry();
        private StatusList _statusList = new StatusList();        

        #endregion

        #region Public Properties

        public Entry Entry
        {
            get { return _entry; }
            set { _entry = value; }
        }

        public StatusList StatusList
        {
            get { return _statusList; }
        }

        #endregion

        #region constructor(s)

        /// <summary>
        /// for Get action
        /// </summary>
        /// <param name="entryId"></param>
        public EntryEditViewModel(int? entryId)
        {
            this.Entry = EntryManager.GetDetail(entryId.Value);                 
        }

        /// <summary>
        /// for Post action
        /// </summary>
        /// <param name="entry"></param>
        public EntryEditViewModel(Entry entry)
        {
            this.Entry = entry;
        }

        #endregion       
    }

проекты:

  • DevJet.Web (веб-сайт ASP.NET MVC проект)

  • DevJet.Web.App.Dictionary (a отдельный проект библиотеки классов)

    В этом проекте я создал несколько папок, таких как: DAL, BLL, BO, ВМ (папка для просмотра моделей)

...