【问题标题】:JSON instead of View ModelsJSON而不是视图模型
【发布时间】:2016-05-04 08:38:49
【问题描述】:

我最近完成了 ASP.NET MVC 方面的培训,我需要一些指导和好的建议。

如果我需要来自多个模型的数据,我已经学会了构建View Models,但最近我听说最好使用JSON 对象并将对象作为模型返回给View,而不是View Models或者只是从Controller 通过AJAX 调用ViewJSON 对象中获取所有数据,然后在HTML 中显示带有jQuery 的数据。

这是当今最好的方式,而不是常见的View Models 和在 URL 中使用 POST/GET 请求刷新页面?

Controller 中,我是否要创建一个JSON 对象并为其填充数据,例如每个Model 的列表,或者它是如何工作的?

【问题讨论】:

  • 答案是,视情况而定。有时绑定客户端很有用,有时则不然。整本书都有并且可以写在这个主题上
  • 此外,您可以将这两种方法结合起来
  • @Liam 好的,我只是想听听其他开发人员对这个主题的看法以及他们是如何工作的,我也想了解更多。

标签: jquery asp.net json ajax asp.net-mvc


【解决方案1】:

我实际上取决于您的需要。事实上,你所有的想法都是正确的,可以根据上下文的需要来使用。

例如;如果您需要进行直接的 CRUD 操作,您可以只使用视图模型并绑定到表单。如果您需要更复杂的结构,您可以创建包含多个视图模型的复合视图模型,并且您仍然可以使用默认的模型行为。 此外,您可以使用 ViewBag/ViewData 字典对象将数据传递给视图。

如果你需要异步的需求,你可以使用 AJAX (Get/Post) 调用

【讨论】:

    【解决方案2】:

    我可能是老派,但我尽量使用view models。我通常做的是在控制器的 action 方法中填充视图模型,然后将此视图模型传递给视图:

    public async Task<ActionResult> Details(int brandId)
    {
         BrandViewModel model = await brandTask.DetailsAsync(brandId);
         if (model == null)
         {
              throw new HttpException(404, "404");
         }
    
         return View(model);
    }
    

    有时我需要先加载一个页面,然后通过以JSON 格式返回数据来用数据填充某些控件。不久前,我在一个项目中工作,我需要在加载表单后用 JSON 数据填充 datatable

    public ActionResult GetApplicationNotes(DataTableParameterViewModel parameterViewModel, int id)
    {
         IEnumerable<Note> notes = noteService.FindAllByApplicationId(id);
    
         var result =
              from note
              in notes
              orderby note.Id descending
              select new[]
              {
                   note.Body,
                   note.CreatedDate.FormatDate()
              };
    
         return Json(new
         {
              sEcho = parameterViewModel.sEcho,
              iTotalRecords = notes.Count(),
              iTotalDisplayRecords = notes.Count(),
              aaData = result
         },
         JsonRequestBehavior.AllowGet);
    }
    

    这一切都取决于您在场景中需要实现的目标。如果我不需要做任何花哨的事情,那么我将始终首先使用视图模型。如果我需要更新网页的某些部分,我会调用AJAX 并以 JSON 格式返回数据。

    【讨论】:

      【解决方案3】:

      使用 web api 控制器而不是 mvc 控制器。

      Mvc 控制器返回渲染的视图,除非你另外指定。 您不能在实体框架上返回对象,因为循环引用因此您应该有 dtos。

      然而 web api 控制器会在没有 dto 的情况下进行这些操作。另外你可以创建query string parameter 然后你会收到你的jsons

      【讨论】:

      • 这不是真的。 Web api 控制器不能做 MVC 控制器不能做的事情。他们基本上在引擎盖下使用相同的技术。 您无法在实体框架上返回对象,因为循环引用如果您遇到这些问题,我建议您的 EF 设置不正确。
      猜你喜欢
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多