использование ViewModels для действий POST в MVC элегантно

@Jiri Vetyska благодарит за сообщение, но в вашем примере что-то не так. Мне нужно было передать цель, которая зависла (это) до функции времени ожидания, и я попробовал ваш подход. Протестировано в IE9 - не работает. Я также сделал некоторые исследования, и кажется, что в качестве здесь указан третий параметр - используемый язык сценария.

Итак, я последовал за ответом @ meder и решил проблему с этим кодом:

$('.targetItemClass').hover(ItemHoverIn, ItemHoverOut);

function ItemHoverIn() {
 //some code here
}

function ItemHoverOut() {
    var THIS = this;
    setTimeout(
        function () { ItemHoverOut_timeout(THIS); },
        100
    );
}
function ItemHoverOut_timeout(target) {
    //do something with target which is hovered out
}

Надеюсь, это полезно для кого-то еще.

23
задан Andrew Bullock 18 August 2009 в 16:22
поделиться

3 ответа

Шаблон MVVM (ViewModel) определенно подходит, у меня был аналогичный вопрос о POST-возврате к действию несколько дней назад - вот ссылка: MVVM и ModelBinders в ASP.NET MVC Framework

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

2
ответ дан 29 November 2019 в 03:11
поделиться

Я чувствовал тот же дискомфорт. Мой единственный способ обойти это - сделать следующее:

  1. Создать связыватель для связывания и проверки модели представления
  2. Создать связыватель для получения объекта из базы данных (или просто сделать это в контроллере)
  3. Вызвать унаследованный метод Save в суперклассе. Этот метод принимает модель представления и объект, который будет обновлен, и выполняет всю работу, которую вы указали в своих шагах.

Метод действия выглядит следующим образом:

public ActionResult Whatever(TViewModel viewModel, TEntity entity)
{
    return Save(viewModel, entity);
}

Базовый контроллер имеет общее определение, например:

public abstract BaseController<TEntity, TViewModel>
    where TEntity : Entity
    where TViewModel : ViewModel

Конструктор имеет две зависимости, одну для репозитория сущностей, а другую для преобразователя модели, например:

protected BaseController(IRepository<TEntity> repository, IMapper<TEntity, TViewModel> mapper)

] Имея это место, затем вы можете написать защищенный метод сохранения, который можно вызывать из действий контроллера в подклассе, например:

protected ActionResult Save(TViewModel viewModel, TEntity entity)
{
    if (!ModelState.IsValid)
        return View(viewModel);

    _mapper.Map(viewModel, entity);
    if (!entity.IsValid)
    {
        // add errors to model state
        return View(viewModel);
    }

    try
    {
        _repository.Save(entity);
        // either redirect with static url or add virtual method for defining redirect in subclass.
    }
    catch (Exception)
    {
        // do something here with the exception
        return View(viewModel);
    }
}

Что касается тестируемости, вы можете протестировать метод сохранения, передавая допустимые / недопустимые модели представления и сущности. Вы можете протестировать реализацию сопоставителя моделей, допустимое состояние модели представления и допустимое состояние объекта отдельно.

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

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

допустимое состояние модели представления и допустимое состояние объекта отдельно.

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

Мне очень интересно услышать, что другие говорят по этому поводу. Отличный вопрос.

допустимое состояние модели представления и допустимое состояние объекта отдельно.

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

Мне очень интересно услышать, что другие говорят по этому поводу. Отличный вопрос.

6
ответ дан 29 November 2019 в 03:11
поделиться

У меня есть много хороших решений в asp.net mvc sample application который находится в download of valueinjecter (mapper, который я использую для отображения ViewModels на/из Entities, вы также можете отображать FormCollection/Request на Entities)

вот один:

    public class TinyController :Controller
        {
            private readonly IModelBuilder<Person, PersonViewModel> modelBuilder;

            public TinyController()
            {
                modelBuilder = new PersonModelBuilder();
            }

            public ActionResult Index()
            {
                return View(modelBuilder.BuildModel(new PersonRepository().Get()));
            }

            [HttpPost]
            public ActionResult Index(PersonViewModel model)
            {
                if (!ModelState.IsValid)
                    return View(modelBuilder.RebuildModel(model));

                   var entity = modelBuilder.BuildEntity(model);
...
//save it or whatever
            }
        }
0
ответ дан 29 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: