@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
}
Надеюсь, это полезно для кого-то еще.
Шаблон MVVM (ViewModel) определенно подходит, у меня был аналогичный вопрос о POST-возврате к действию несколько дней назад - вот ссылка: MVVM и ModelBinders в ASP.NET MVC Framework
В результате вы можете использовать атрибут Bind для отправки обратно сложного типа, который вам нужен.
Я чувствовал тот же дискомфорт. Мой единственный способ обойти это - сделать следующее:
Метод действия выглядит следующим образом:
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);
}
}
Что касается тестируемости, вы можете протестировать метод сохранения, передавая допустимые / недопустимые модели представления и сущности. Вы можете протестировать реализацию сопоставителя моделей, допустимое состояние модели представления и допустимое состояние объекта отдельно.
Сделав базовый контроллер универсальным, вы можете повторить этот шаблон для каждой комбинации объект / модель представления в вашем домен, если вы создаете много контроллеров для выполнения одного и того же действия.
Мне очень интересно услышать, что другие говорят об этом. Отличный вопрос.
допустимое состояние модели представления и допустимое состояние объекта отдельно.Сделав базовый контроллер универсальным, вы можете повторить этот шаблон для каждой комбинации объект / модель представления в своем домене, если вы создаете много контроллеров для сделайте то же самое.
Мне очень интересно услышать, что другие говорят по этому поводу. Отличный вопрос.
допустимое состояние модели представления и допустимое состояние объекта отдельно.Сделав базовый контроллер универсальным, вы можете повторить этот шаблон для каждой комбинации объект / модель представления в своем домене, если вы создаете много контроллеров для сделайте то же самое.
Мне очень интересно услышать, что другие говорят по этому поводу. Отличный вопрос.
У меня есть много хороших решений в 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
}
}