C#MVC从Ajax调用或返回发布的模型重新查找Post Back上的数据库

时间:2015-02-05 18:27:35

标签: c# ajax asp.net-mvc post

背景

我有一个在Partial ViewsEditor Templates的帮助下分成许多小形式的视图。每个表单都有一个保存按钮,当用户提交其中一个表单时,将显示该部分的loader.gif,直到完成ajax调用。现在,我只是根据发布的模型返回局部视图。如果他们发布的数据存在问题,我的验证类将返回一条消息,否则应用程序将抛出异​​常。

问题

我能看到的一个问题是,如果我的应用程序认为数据已保存(例如没有异常且没有验证错误),但由于某种原因,客户端数据未正确映射到实体,服务,数据库等(我确实有单元测试到位)。如果我返回给我的模型,客户端将不会看到更改失败,因为新值将在视图中。如果我重新查询数据库并重新填充模型,用户将在视图中看到成功消息,但数据将恢复到保存之前。 requerying确实为action方法增加了额外的开销和逻辑,但是有必要吗?只是想知道其他人做了什么,或者我是否在考虑这个问题。感谢。

// this is the view that other actions will call because they are all the same on the controller
// only use TQueryParam if I am requerying
[HttpPost]
[ValidateAntiForgeryToken]
public PartialViewResult Edit<TModel, TCommandParam, TQueryParam>(TModel model, string viewName, IViewModelEnricher<TModel> enricher = null) where TCommandParam : ICommandParam
{   
  // fill in necessary properties such as select lists
  if (enricher != null)
    enricher.Enrich(model);

  if (ModelState.IsValid)
  {
    var cmdParam = Mapper.Map<TModel, TCommandParam>(model);

    foreach (var error in _dispatcher.Validate(cmdParam))
      ModelState.AddModelError(error.MemberName, error.Message);

    if (ModelState.IsValid)
    {
      _dispatcher.Dispatch(cmdParam);
      TempData["Saved"] = "Your data was saved successfully!";

      // TODO: do i requery database for the model and make this method a little more complicated?
      //var result = _dispatcher.Dispatch<TQueryParam>(new GetOperationById(model.Id));
      //model = Mapper.Map<TQueryParam, TModel>(result);
    }
  }

  return PartialView(viewName, model);
}

0 个答案:

没有答案