【问题标题】:MVC - returning data via ajax call renders it as pageMVC - 通过 ajax 调用返回数据将其呈现为页面
【发布时间】:2017-09-28 08:27:33
【问题描述】:

MVC 新手。

情景是。使用第三方上传图片库。提交表单时,我想通过 ajax 进行调用以提交数据并返回插入的项目 ID。然后,我将该 ID 用于第 3 方上传库来构建将图像上传到的文件夹。

我有 ajax 调用工作并将数据插入数据库并获取插入的 ID。但是当调试从控制器返回时,它会将 id 呈现为整个页面。

我认为这里缺少 MVC 的基本内容。

cshtml文件:

<div class="col-md-8">
              <input type="submit" value="Add Item" id="submitItem" />
              <script>
                $(document).ready(function () {
                  $("#submitItem").submit(function () {
                    event.preventDefault();

                    insertData();
                  });
                });

                function insertData()
                {
                  var requestData = {
                    userID: $("#hdnUserID").val(),
                    title: $("#title").val(),
                    typeID: $("#typeID").val(),
                    description: $("#description").val()
                  };

                  $.ajax({
                    url: '<%= Url.Action("ItemUserDashBoard", "Home") %>',
                    type: 'post',
                    data: JSON.stringify(requestData),
                    dataType: 'json',
                    success: function (data) {
                      // your data could be a View or Json or what ever you returned in your action method 
                      // parse your data here
                      alert(data);
                      $("#fine-uploader-gallery").fineUploader("uploadStoredFiles");
                    },
                    processData: false
                  });
                }
              </script>
            </div>

HomeController.cs

[HttpPost]
    public JsonResult ItemUserDashBoard(ItemAppraise.Models.iaDashBoardModel objItemUserDashBoard)
    {
      if(ModelState.IsValid)
      {
        using (dbContext)
        {
          ia_items iaItem = new ia_items
          {
            userID = objItemUserDashBoard.iaItems.userID,
            typeID = objItemUserDashBoard.iaItems.typeID,
            title = objItemUserDashBoard.iaItems.title,
            description = objItemUserDashBoard.iaItems.description,
            lastUpdate = DateTime.Now
          };

          dbContext.ia_items.Add(iaItem);
          dbContext.SaveChanges();

          //objItemUserDashBoard.iaItems.itemID = iaItem.itemID;
          return Json(iaItem.itemID.ToString());
        }
      }
      else{
        return null;
      }
    }

Fiddler 显示它具有 Content-Type: application/json; charset=utf-8.

但页面在控制 url 'http://localhost:55689/Home/ItemUserDashBoard' 下呈现,仅显示项目 ID。

如何取回数据以便在 ajax 调用的成功部分使用而不被渲染?这是部分视图还是类似的东西?

感谢任何指导。

【问题讨论】:

    标签: json ajax asp.net-mvc


    【解决方案1】:

    在标准 MVC 中。对控制器的任何调用都像 Web 请求一样被处理。因此,如果我对您的理解正确 - 您的 httpPost 的结果正在呈现而不是所需的视图?这是因为您正在返回 JSON,因此控制器假定这是您要呈现的内容。如果您希望改为呈现视图(并以某种方式使用该响应数据),您可以尝试将返回类型设置为 ActionResult 并返回 View("nameofview"); 您可以将响应数据传递给 number of ways 中的该视图。

    附带说明我认为使用 Web Api 而不是 MVC 可以更好地解决您面临的问题。它适用于 MVC,并且可能是实现所需功能的更简单方法。将您的发布请求和数据库交互与决定返回哪个视图的逻辑分开。

    【讨论】:

    • 感谢迈克尔的快速回复。是的,正在呈现返回,而不是返回我所在的视图。我基本上只想获取数据并将其用于 ajax 调用的成功部分。该信息对实际视图是不可见的。我只需要将它传递给第 3 方图像上传器,这样我就可以根据该数字构建一个文件夹。
    • 关于 Web Api 的要点。我正在进行的这个 ajax 调用与 View 本身无关。它只是插入数据并获取返回的id的一种手段。就像我说的,“添加项目视图”应该对这种情况一无所知,最终结果是项目(数据和图像)被添加,页面移动到“列表项目视图”并显示新添加的项目。
    • 没问题,希望对您有所帮助。当我最初学习 MVC 和 ASP.Net 时,我发现使用 Web API 一切都变得更加清晰和简单。通常,我拥有的任何 MVC 控制器都非常简单——所有数据库内容都发生在 Web API 中。导致更好的关注点分离。即使您return View("relaventView") 并按照我的建议将一些数据作为您的 httpPost 的结果传递给它 - 我认为它会导致重新渲染,这是不理想的。因此,如果您有时间,前端的 WebApi 和 Ajax 可以对您的用户透明地协同工作 - 无需重新渲染。
    • 有道理。多年来,我一直是 C# .net 开发人员,最终决定改用 MVC。我认为我在确保一切都是基于 MVC 的过程中试图成为一个纯粹主义者。你的观点说得很好............解决方案的总和可以由许多部分组成。再次感谢您以“网络”的方式让我重新扎根。
    猜你喜欢
    • 2010-09-09
    • 2015-04-12
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多