【问题标题】:How do I pass a JSON object as well as a simple string to a controller via an AJAX call?如何通过 AJAX 调用将 JSON 对象和简单字符串传递给控制器​​?
【发布时间】:2013-09-13 22:08:03
【问题描述】:

这是我的路线:

routes.MapHttpRoute(name: "InsertOrUpdateDirector", routeTemplate: "api/awards/directors", defaults: new
    {
       controller = "Awards", action = "InsertDirector"
    });

这是控制器方法:

[HttpPost]
public void InsertOrUpdateDirector(Director director, string operation)
{
   string query = null;

   myConnection.Open();
   if (operation == "I")
   {
     query = "INSERT INTO...";
   }
   else if (operation == "U")
   {
     query = "UPDATE...";
   }
   var cmd = new SqlCommand(query, myConnection);
   cmd.ExecuteNonQuery();
   myConnection.Close();
}

如果我向上面发送一个 JSON 对象,它就可以工作。

现在我需要能够传递 JSON 对象以及字符串参数。

这是仅传递 JSON 对象的 AJAX 调用:

$.ajax({
        url: "http://localhost/x/api/awards/directors",
        type: "POST",
        dataType: "json",
        data: directorData 
     }).done(function () {
         detailRow.find(".directorsOrRecipients").data("kendoGrid").refresh();
     });

我的问题是,在这种情况下,如何将 JSON 对象以及字符串“I”传递给控制器​​?

directorData 是一个 JSON 对象,顺便说一下。

【问题讨论】:

  • 您需要创建一个带有director 属性和operation 属性的JSON 对象。前者包含您的directorData,后者包含您希望传递的字符串。
  • 这实际上是最简单的解决方案。

标签: ajax asp.net-web-api


【解决方案1】:

您需要创建一个带有 director 属性和 operation 属性的 JSON 对象。前者包含你的directorData,后者包含你想要传递的字符串。

【讨论】:

  • 这是最简单的解决方案。谢谢!
【解决方案2】:

一种快速的方法是将其作为查询字符串参数添加到 URL:

url: "http://localhost/x/api/awards/directors?operation=I"

或者,如果你有一个变量:

url: "http://localhost/x/api/awards/directors?operation=" + operationValue

另一种选择是将“操作”值添加到 JSON 对象本身。我不知道您的代码中的 Director 是什么,但为了争论,我们假设它是这样的:

{
    "ID" : 1,
    "Name" : "John"
}

然后您可以向该 JSON 对象添加另一个值:

{
    "ID" : 1,
    "Name" : "John",
    "operation" : "I"
}

这不会混淆服务器端操作方法参数的模型绑定。 JSON 对象不需要完全与其中一个模型对齐。模型绑定将尽最大努力根据发布到操作的所有值来确定操作方法参数值。所以在上面的 JSON 对象中,它会知道“ID”和“Name”组成了一个Director 对象,而“操作”就是string 对象。

【讨论】:

    【解决方案3】:

    您可以调整路线以便它可以处理操作:

    routes.MapHttpRoute(name: "InsertOrUpdateDirector",
        routeTemplate: "api/awards/directors/{operation}",
        defaults: new
           {
               controller = "Awards",
               action = "InsertDirector",
               operation = UrlParameter.Optional
           });
    

    然后当你调用它时,适当地格式化 URL:

    url: "/Awards/directors/someoper",
    

    这适用于常规 MVC(我在这台机器上没有 WebAPI,但我希望它也能在那里工作)。

    就我个人而言,我会避免将operation 与常规模型混合使用。它可能会起作用,但以后可能会变得混乱。

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 2016-11-08
      • 2017-09-30
      • 2013-01-29
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      相关资源
      最近更新 更多