Ajax請求傳遞參數遇到的問題


WebAPI傳遞參數遇到的問題

Ajax的格式:

    $.ajax({
        type: "get", //數據發送的方式(post 或者 get)
        url: "/admin/index", //要發送的后台地址
        data: { val1: "1", val2: "2" }, //要發送的數據(參數)格式為{'val1':"1","val2":"2"}
        dataType: "json", //后台處理后返回的數據格式
        success: function(data) {//ajax請求成功后觸發的方法
            alert('請求成功');
        },
        error: function(msg) {//ajax請求失敗后觸發的方法
            alert(msg); //彈出錯誤信息
        }
    });

 

后台實體類(Person):

namespace WebApi.Models
{
    public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string EnglishName { get; set; }
    }
}

后台接口:

public class TestController : ApiController
{
    public Person GetEnglishName(int ID, string Name)
    {
        Person man = new Person();
        man.ID = ID;
        man.Name = Name;
        man.EnglishName = "Bert";
        return man;
    }
}

前端Ajax請求:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <title></title>
</head>
<body>
    <input type="submit" id="testId" /><input type="text" id="text1" />
</
body> </html> <script type="text/javascript"> $("#testId").click(function() { $.ajax({ url: "/api/Test/GetEnglishName", type: "GET", data: { "ID": 1, "Name": "yzc" }, success: function(data) { $("#text1").val(data.EnglishName); } }); }); </script>

結果:

 

如上,這是最普通的一次WebApi的Ajax請求,接下來我們來講幾個比較特殊的例子。代碼修改如下:黃色熒光筆的都是改動的代碼。

后台接口:

public class TestController : ApiController
{
    public Person SetEnglishName(int ID, string Name)
    {
        Person man = new Person();
        man.ID = ID;
        man.Name = Name;
        man.EnglishName = "Bert";
        return man;
    }
}

前端Ajax請求:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <title></title>
</head>
<body>
    <input type="submit" id="testId" /><input type="text" id="text1" />
</body>
</html>

<script type="text/javascript">
    $("#testId").click(function() {
        $.ajax({
            url: "/api/Test/SetEnglishName",
            type: "GET",
            data: { "ID": 1, "Name": "yzc" },
            success: function(data) {
                $("#text1").val(data.EnglishName);
            }
        });
    });
</script>

結果:

 

結論:

我們僅僅只是更改了接口的名稱而已,從GetEnglishName改為SetEnglishName,為什么就找不到該方法了呢?

原因是:WebAPI對於后台方法接口在沒有給它添加訪問方式的前提下(如:[HttpPost]),並且方法名稱開頭帶着Get的話,默認是Get請求。

所有在上面例子中,方法名既沒有標明請求方式,也不是Get開頭,它自然找不到可以允許訪問的方法了,建議:不管是什么類型的請求都在方法上設置訪問類型。

 

post請求傳遞一個參數的時候,data並不是傳的鍵/值對形式,而是data:{"":"yzc"},記住這種特殊情況,不然后台是獲取不到前端傳過去的值得,至於原因是:Web API 要求請求傳遞的 [FromBody] 參數,是有一個特定的格式,才能被正確的獲取到。

post傳遞多個參數的時候 (被標記[FromBody]的參數只能出現一次,被標記為[FromUri]的參數可以出現多次,如果被標記為[FromUri]的參數是簡單參數,該標記可以去掉。)

請求的時候

1、data:JSON.stringify(x)和contentType: "application/json"一起使用,或者

2、data:{為鍵值對},並且不能加contentType: "application/json",這兩種情況后台[FromBody]參數都能獲取到值。(經測試過,當出現交叉情況,如:data里面為鍵值對,且加了contentType: "application/json",后台將不能訪問數據)

當post請求的參數多的時候,就需要封裝在一個類里面,這樣后台也需要創建臨時類來接收,而dynamic可以讓我們省掉許多類。然而前端Ajax請求參數的配置目前自己試過的只有data:JSON.stringify(x)和contentType:"application/json"一起后台才能拿到數據。

 

后台接口:

public class TestController : ApiController
{
    [HttpPost]
    public Person GetEnglishName(dynamic per)
    {
        Person man = new Person();
        man.ID = per.ID;
        man.Name = per.Name;
        man.EnglishName = "Bert";
        return man;
    }
}

前端Ajax請求:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="Scripts/jquery-1.10.2.min.js"></script>
</head>
<body>
    <input type="submit" id="testId" /><input type="text" id="text1" />
</body>
</html>

<script type="text/javascript">
    $("#testId").click(function() {
        $.ajax({
            url: "/api/Test/GetEnglishName",
 type: "POST", contentType: "application/json", data: JSON.stringify({ "ID": 1, "Name": "yzc" }),
            success: function(data) {
                $("#text1").val(data.EnglishName);
            }
        });
    });
</script>

結果:


原文:https://www.cnblogs.com/yzcStudy/p/5767109.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM