【问题标题】:How To Call an MVC5 Action from Javascript?如何从 Javascript 调用 MVC5 动作?
【发布时间】:2019-08-01 14:19:47
【问题描述】:

我正在尝试使用 Javascript 更新表(基于视图的用户输入)。直到alert("We Made it This Far") 一切似乎都在工作。然后我得到alert("Failed")

我在控制器的第一行放置了一个断点。在调试中运行时,我从未遇到过该断点。所以我想我们从来没有真正到达控制器。

我已经尝试了许多不同的 URL 变体来访问控制器,但我正在拔头发。

我的控制器是NewOrderController.cs。我的行动是SaveData

我将在下面发布我的代码。我认为不需要控制器代码,因为我认为我什至没有走那么远来看看它是否有效。但是,如果需要该代码,请告诉我,我也会发布它。

$("#addsupply").click(function() {
  var RequisitionNumber = document.getElementById("reqlabel").textContent;
  var UnitsOrdered = document.getElementById('HowMany').value;

  var e = document.getElementById("SuppliesList");
  var SuppliesID = e.options[e.selectedIndex].value;

  if (UnitsOrdered.trim() == "" || SuppliesID.trim() == "") {
    alert("You Must Select a Supply AND Enter The Amount of Supplies to Order!");
    return false;
  }

  alert("we made it this far")
  // here call server side function for save data using jquery ajax

  $.ajax({
    url: "../NewOrder/SaveData",
    // url: '@Url.Action("NewOrder", "SaveData")',
    type: "POST",
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify({
      "RequisitionNumber": RequisitionNumber,
      "UnitsOrdered": UnitsOrdered,
      "SuppliesID": SuppliesID
    }),
    success: function(data) {
      if (data.d == "success") {
        alert("Data saved successfully");
        // clear text here after save complete
        $('#HowMany').val('');
      }
    },
    error: function(xhr, ajaxOptions, thrownError) {
      // alert(thrownError);
      alert("failed");
    }
  }).done(function() {
    alert("we did it");
  });
});

编辑:为 SaveData 方法添加代码:

        [WebMethod]
    public static string SaveData(string RequisitionNumber, int UnitsOrdered, int SuppliesID)
    {

        string status = "";
        // apply validation here
        ICS_Orders c = new ICS_Orders { LineID = 0, RequisitionNumber = RequisitionNumber, UnitsOrdered = UnitsOrdered, SuppliesID = SuppliesID };

        // here MyDatabaseEntities  is our dbContext
        using (ICSContext dc = new ICSContext())
        {
            dc.ICS_Orders.Add(c);
            dc.SaveChanges();
            status = "success";
        }
        return status;
    }
}  

}

第二次编辑:以下是我从 Fidder 得到的错误。未找到资源。我已经尝试了所有方式(但松散)来添加网址,但似乎没有任何效果。不明白为什么它找不到我的控制器方法。它在我的控制器文件夹中。 .这是个问题吗?

        <h2> <i>The resource cannot be found.</i> </h2></span>

        <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">

        <b> Description: </b>HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. &nbsp;Please review the following URL and make sure that it is spelled correctly.
        <br><br>

        <b> Requested URL: </b>/NewOrder/SaveData<br><br>

【问题讨论】:

  • 检查控制台以了解响应的确切错误。我建议取消注释 @Url.Action() 调用,以便您知道 URL 是正确的。
  • 请展示您的SaveData 方法是什么样的。
  • @jcruz - 我添加了 SaveData 方法代码。
  • 尝试将 [FromBody] 参数绑定添加到您的方法。阅读此处了解更多信息:docs.microsoft.com/en-us/aspnet/web-api/overview/…

标签: jquery asp.net-mvc-5 jscript


【解决方案1】:

请更新 MVC 操作语法:

来自

[WebMethod]
public static string SaveData(string RequisitionNumber, int UnitsOrdered, int SuppliesID)

[HttpPost]
public ActionResult SaveData(string RequisitionNumber, int UnitsOrdered, int SuppliesID)

另外, (1) 只是关于更好实践的附注:您可以创建一个具有这些属性的类,并让 MVC 负责通过序列化映射到正确的属性,而不是用各种参数加载您的函数。

<form action="@Url.Action("SaveData", "Orders")"  method="post">
@using (Html.BeginForm("SaveData", "Orders", new {}, FormMethod.Post)) // Please check the syntax here.

(2) 您不使用表单发布是否有原因?您使用的是剃刀视图还是其他东西?如果是剃刀,你可以使用@Html.BeginForm

【讨论】:

  • 谢谢!正如你所建议的,我最终使用了@Html.BeginFom。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 2014-12-14
相关资源
最近更新 更多