Отображение свойств модели в контроллер - PullRequest
0 голосов
/ 11 марта 2012

Я целый день искал решение своей проблемы, но не нашел ничего приемлемого ...

Мой проект построен с использованием шаблона MVC, и я не уверен, что смогусделать модель напрямую доступной для просмотра.Насколько я знаю, она предназначена для того, чтобы «скрыть» модель от вида и использовать контроллер в качестве «прокси».

Я покажу вам пример для лучшего понимания моей проблемы.* Модель:

internal class ExampleModel 
{
    public Size GridSize {get; set;}
    //a lot more properties
    //...
    //business logic
}

Контроллер:

internal class ExampleController 
{
    private ExampleModel m_Model;

    //Logic "proxy" with some extensions
    //A lot of functions
    //--------------------
    //Mapping the model's properties
    public Size GridSize 
    {
        get
        {
            return m_Model.GridSize;
        }
        set
        {
            m_Model.GridSize = value;
        }
    }
    //A lot more properties, mapping the ones from the model
}

Итак, мой вопрос: как я могу автоматически сопоставить свойства модели с контроллером?Потому что "синхронизировать" свойства между моделью и контроллером ... отстой?: P Или я мог бы просто сделать m_Model публичной?Я действительно не знаю, что делать ..

Заранее спасибо :)

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Как правило, вы передаете модель в представление в тот момент, когда вы возвращаете ее в действии контроллера.

public class HomeController
{
   public ActionResult Index()
   {
      // Do something with model here, in this example we are creating a new model
      var model = new Model(); 

      // Send the model to the view, this is then available as @Model
      return View(model);
   }
}

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

Некоторым пуристам не нравится открывать модель для представления, поэтому эта ссылка предоставляет несколько дополнительных подходов:

http://blogs.msdn.com/b/simonince/archive/2010/01/26/view-models-in-asp-net-mvc.aspx

0 голосов
/ 11 марта 2012

devdigital's ответ правильный, вы не должны показывать свою модель через контроллер (с точки зрения дизайна, это заставляет ваш View знать что-то о контроллере, который превосходит цель ...). Ваш контроллер должен подготовить все данные, которые понадобятся вашему представлению, и передать их при создании ViewResult (что и делает return View(model) для имени представления по умолчанию).

Однако вы также спросили, есть ли лучший способ сопоставления свойств между объектами. Я не думаю, что ссылка devdigital упоминает этот конкретный инструмент (но он упоминает картографы): AutoMapper (http://automapper.codeplex.com/).

Сначала вы настраиваете карту между двумя объектами / моделями / объектами любого типа. Поведение по умолчанию просто назначит свойства с тем же именем, но затем вы можете настроить игнорирование свойств или настроить присвоение значения.

AutoMapper.Mapper.CreateMap<ExampleEntity, ExampleModel>();

Тогда вы просто используете это ...

ExampleModel model = AutoMapper.Mapper.Map<ExampleModel>(myEntity);

Это будет работать для отображения сущностей 1: 1. Я бы не рекомендовал использовать AutoMapper, если вы на самом деле расширяете ViewModel (ViewModel - это то, что вы будете использовать для предоставления представления с данными, которые поступают из разных сущностей или источников в целом).

...