MVC和WebApi 使用get和post 傳遞參數。


我們總結一下用js請求服務器的傳參方法。

Get方式

Get主要是用來查詢,一般分為無參,一個參數,多個參數,實體對象參數。

1、無參

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Get沒有參數  
  2. var get_f1 = function() {  
  3.     $.ajax({  
  4.         type: "get",  
  5.         url: "/api/Demo",  
  6.         success: function(data, status) {  
  7.             if (status == "success") {  
  8.                 $("#div_test").html(data);  
  9.             }  
  10.         }  
  11.     });  
  12. }  
        //Get沒有參數
        var get_f1 = function() {
            $.ajax({
                type: "get",
                url: "/api/Demo",
                success: function(data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

 

2、一個參數

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Get一個參數  
  2. var get_f2 = function() {  
  3.     $.ajax({  
  4.         type: "get",  
  5.         url: "/api/Demo",  
  6.         data: { strQuery: JSON.stringify({ Id: "1", Name: "Jim", CreateTime: "1988-09-11" }) },  
  7.         contentType: "application/json",  
  8.         success: function(data, status) {  
  9.             if (status == "success") {  
  10.                 $("#div_test").html(data);  
  11.             }  
  12.         }  
  13.     });  
  14. }  
        //Get一個參數
        var get_f2 = function() {
            $.ajax({
                type: "get",
                url: "/api/Demo",
                data: { strQuery: JSON.stringify({ Id: "1", Name: "Jim", CreateTime: "1988-09-11" }) },
                contentType: "application/json",
                success: function(data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

 

后台控制器方法

[csharp] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. /// <summary>  
  2. /// 一個參數  
  3. /// </summary>  
  4. /// <param name="strQuery"></param>  
  5. /// <returns></returns>  
  6. [HttpGet]  
  7. public string Get(string strQuery)  
  8. {  
  9.     //一個參數的時候,如果前端是傳過來的是字符串的json可以反序列化成對象。  
  10.     //TbCharging oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TbCharging>(strQuery);  
  11.     //return String.Format("{0},{1},{2},{3}", oData.Id, oData.Name, oData.Des, oData.CreateTime.ToString("yyyy-MM-dd hh:mm:ss"));  
  12.     return "一個參數" + strQuery;  
  13. }  
        /// <summary>
        /// 一個參數
        /// </summary>
        /// <param name="strQuery"></param>
        /// <returns></returns>
        [HttpGet]
        public string Get(string strQuery)
        {
            //一個參數的時候,如果前端是傳過來的是字符串的json可以反序列化成對象。
            //TbCharging oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TbCharging>(strQuery);
            //return String.Format("{0},{1},{2},{3}", oData.Id, oData.Name, oData.Des, oData.CreateTime.ToString("yyyy-MM-dd hh:mm:ss"));
            return "一個參數" + strQuery;
        }


備注:在Get方式的時候我們也可以把參數放在url,我這里為了前台寫得統一些,全都放在data里面,感覺好看一點。

 

3、多個參數

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Get多個參數  
  2. var get_f3 = function() {  
  3.     $.ajax({  
  4.         type: "get",  
  5.         url: "/api/Demo",   
  6.         data: { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },  
  7.         success: function(data, status) {  
  8.             if (status == "success") {  
  9.                 $("#div_test").html(data);  
  10.             }  
  11.         }  
  12.     });  
  13. }  
        //Get多個參數
        var get_f3 = function() {
            $.ajax({
                type: "get",
                url: "/api/Demo", 
                data: { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },
                success: function(data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

 

后台控制器方法

[csharp] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. /// <summary>  
  2. /// 多個參數  
  3. /// </summary>  
  4. /// <param name="Id"></param>  
  5. /// <param name="Name"></param>  
  6. /// <param name="CreateTime"></param>  
  7. /// <returns></returns>  
  8. [HttpGet]  
  9. public string Get(int Id, string Name, DateTime CreateTime)  
  10. {  
  11.     return String.Format("多個參數,{0},{1},{2}", Id, Name, CreateTime.ToString("yyyy-MM-dd hh:mm:ss"));  
  12. }  
        /// <summary>
        /// 多個參數
        /// </summary>
        /// <param name="Id"></param>
        /// <param name="Name"></param>
        /// <param name="CreateTime"></param>
        /// <returns></returns>
        [HttpGet]
        public string Get(int Id, string Name, DateTime CreateTime)
        {
            return String.Format("多個參數,{0},{1},{2}", Id, Name, CreateTime.ToString("yyyy-MM-dd hh:mm:ss"));
        }

 

 

4、一個實體對象參數

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Get實體對象作為參數  
  2. var get_f4 = function() {  
  3.     $.ajax({  
  4.         type: "get",  
  5.         url: "/api/Demo/GetModel",  
  6.         data: { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },  
  7.         success: function(data, status) {  
  8.             if (status == "success") {  
  9.                 $("#div_test").html(data);  
  10.             }  
  11.         }  
  12.     });  
  13. }  
        //Get實體對象作為參數
        var get_f4 = function() {
            $.ajax({
                type: "get",
                url: "/api/Demo/GetModel",
                data: { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },
                success: function(data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }


備注:到這里有沒有發現多個參數和一個實體對象的請求方法是一樣的,假如兩個接收的方法都寫在同一個控制器里面的話,路由是區分不出來要匹配那個方法處理,

 

所以要用自定義路由來區分,在WebApi里面改方法名字是沒有用的。

后台控制器方法

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. /// <summary>  
  2. /// 一個實體對象參數  
  3. /// </summary>  
  4. /// <param name="oData"></param>  
  5. /// <returns></returns>  
  6. [HttpGet]  
  7. [Route("GetModel")]  
  8. public string Get([FromUri]TbCharging oData)  
  9. {  
  10.     return String.Format("一個實體對象參數,{0},{1},{2},{3}", oData.Id, oData.Name, oData.Des, oData.CreateTime.ToString("yyyy-MM-dd hh:mm:ss"));   
  11. }  
        /// <summary>
        /// 一個實體對象參數
        /// </summary>
        /// <param name="oData"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("GetModel")]
        public string Get([FromUri]TbCharging oData)
        {
            return String.Format("一個實體對象參數,{0},{1},{2},{3}", oData.Id, oData.Name, oData.Des, oData.CreateTime.ToString("yyyy-MM-dd hh:mm:ss")); 
        }


備注:在使用Get傳遞實體對象參數的時候要注意,因為Get方式的時候參數是寫在url的,所以我們在后台用[FromBody]是拿不到實體參數的,需要寫[FromUri]才行。

 

Post方式

Post方式我們一般用來做增、刪、改操作。在WebApi中Post僅僅用來做增加操作,修改用Put,刪除用Delete。這些在新建模板的時候就自動為我們生成了。

還有要提一下的是Post只能傳遞一個參數,如果需要多個參數的時候我們需要把它們合並成一個擴展對象,當做對象來傳遞。

在后台接收的時候我們需要在參數列表里面寫上[ print?在CODE上查看代碼片派生到我的代碼片

  1. //Post一個參數  
  2. var post_f1 = function() {  
  3.     $.ajax({  
  4.         type: "post",  
  5.         url: "/api/Demo",  
  6.         data: { "": "Jim" },  
  7.         //data: "=Jim", //兩種寫法,其他寫法獲取不到值  
  8.         success: function(data, status) {  
  9.             if (status == "success") {  
  10.                 $("#div_test").html(data);  
  11.             }  
  12.         }  
  13.     });  
  14. }  
        //Post一個參數
        var post_f1 = function() {
            $.ajax({
                type: "post",
                url: "/api/Demo",
                data: { "": "Jim" },
                //data: "=Jim", //兩種寫法,其他寫法獲取不到值
                success: function(data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

 

注意:在寫參數的時候我們不能把參數寫成 print?在CODE上查看代碼片派生到我的代碼片

  1. /// <summary>  
  2. /// 一個參數  
  3. /// </summary>  
  4. /// <param name="name"></param>  
  5. /// <returns></returns>  
  6. public string Post([FromBody]string name)  
  7. {  
  8.     return "一個參數," + name;  
  9. }  
        /// <summary>
        /// 一個參數
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string Post([FromBody]string name)
        {
            return "一個參數," + name;
        }

 

2、一個實體對象參數

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Post一個對象(Post不能提交多個參數,只能將多個參數封裝成一個對象)  
  2. var post_f2 = function () {  
  3.     var postdata = { Id: "1", Name: "Jim", CreateTime: "1988-09-11" };  
  4.     $.ajax({  
  5.         type: "post",  
  6.         url: "/api/Demo/PostAdd",//多個post的時候,路由會匹配不到,所以要自定義路由  
  7.         //data: { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },  
  8.         data: postdata,  
  9.         success: function (data, status) {  
  10.             if (status == "success") {  
  11.                 $("#div_test").html(data);  
  12.             }  
  13.         }  
  14.     });  
  15. }  
        //Post一個對象(Post不能提交多個參數,只能將多個參數封裝成一個對象)
        var post_f2 = function () {
            var postdata = { Id: "1", Name: "Jim", CreateTime: "1988-09-11" };
            $.ajax({
                type: "post",
                url: "/api/Demo/PostAdd",//多個post的時候,路由會匹配不到,所以要自定義路由
                //data: { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },
                data: postdata,
                success: function (data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

 

后台控制器方法

[csharp] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. /// <summary>  
  2. /// 一個對象  
  3. /// </summary>  
  4. /// <param name="oData"></param>  
  5. /// <returns></returns>  
  6. [HttpPost]  
  7. [Route("PostAdd")]  
  8. public object Post([FromBody]TbCharging oData)  
  9. {  
  10.     var strName = String.Format("一個對象,{0},{1}", oData.Id, oData.Name);  
  11.     return strName;  
  12. }  
        /// <summary>
        /// 一個對象
        /// </summary>
        /// <param name="oData"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PostAdd")]
        public object Post([FromBody]TbCharging oData)
        {
            var strName = String.Format("一個對象,{0},{1}", oData.Id, oData.Name);
            return strName;
        }

備注:這里參數列表最好寫上[FromBody],雖然不寫也能拿到值。

 

3、一個數組參數

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Post數組作為參數  
  2. var post_f3 = function () {  
  3.     var arr = ["1", "2", "3", "4"];  
  4.     $.ajax({  
  5.         type: "post",  
  6.         url: "/api/Demo/PostArray",  
  7.         contentType: 'application/json',  
  8.         data: JSON.stringify(arr),  
  9.         success: function (data, status) {  
  10.             if (status == "success") {  
  11.                 $("#div_test").html(data);  
  12.             }  
  13.         }  
  14.     });  
  15. }  
        //Post數組作為參數
        var post_f3 = function () {
            var arr = ["1", "2", "3", "4"];
            $.ajax({
                type: "post",
                url: "/api/Demo/PostArray",
                contentType: 'application/json',
                data: JSON.stringify(arr),
                success: function (data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

這里我們說一下contentType和dataType。

 

contentType

發送信息至服務器時內容編碼類型。假如你不寫的話,默認值是: "application/x-www-form-urlencoded"。

dataType

預期服務器返回的數據類型。

如果我們Post提交的是json參數,最好就寫上 print?在CODE上查看代碼片派生到我的代碼片

  1. /// <summary>  
  2. /// 數組作為參數  
  3. /// </summary>  
  4. /// <param name="ids"></param>  
  5. /// <returns></returns>  
  6. [HttpPost]  
  7. [Route("PostArray")]  
  8. public object Post(string[] ids)  
  9. {  
  10.     return String.Format("{0},{1},{2}", ids[0], ids[1], ids[2]);  
  11. }  
        /// <summary>
        /// 數組作為參數
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PostArray")]
        public object Post(string[] ids)
        {
            return String.Format("{0},{1},{2}", ids[0], ids[1], ids[2]);
        }

 

4、實體集合參數

[javascript] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. //Post對象集合,多個相同對象(多個不同對象的時候可以將多個對象封裝成一個擴展對象)  
  2. var post_f4 = function () {  
  3.     var arr = [  
  4.         { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },  
  5.         { Id: "2", Name: "Lilei", CreateTime: "1990-12-11" },  
  6.         { Id: "3", Name: "Lucy", CreateTime: "1986-01-10" }  
  7.     ];  
  8.     $.ajax({  
  9.         type: "post",  
  10.         url: "/api/Demo/PostMulti",//多個post的時候,路由會匹配不到,所以要自定義路由    
  11.         contentType: 'application/json',  
  12.         data: JSON.stringify(arr),  
  13.         success: function (data, status) {  
  14.             if (status == "success") {  
  15.                 $("#div_test").html(data);  
  16.             }  
  17.         }  
  18.     });  
  19. }  
        //Post對象集合,多個相同對象(多個不同對象的時候可以將多個對象封裝成一個擴展對象)
        var post_f4 = function () {
            var arr = [
                { Id: "1", Name: "Jim", CreateTime: "1988-09-11" },
                { Id: "2", Name: "Lilei", CreateTime: "1990-12-11" },
                { Id: "3", Name: "Lucy", CreateTime: "1986-01-10" }
            ];
            $.ajax({
                type: "post",
                url: "/api/Demo/PostMulti",//多個post的時候,路由會匹配不到,所以要自定義路由  
                contentType: 'application/json',
                data: JSON.stringify(arr),
                success: function (data, status) {
                    if (status == "success") {
                        $("#div_test").html(data);
                    }
                }
            });
        }

 

后台的控制器方法

[csharp] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. /// <summary>  
  2. /// 對象集合  
  3. /// </summary>  
  4. /// <param name="lstCharging"></param>  
  5. /// <returns></returns>  
  6. [HttpPost]  
  7. [Route("PostMulti")]  
  8. public object Post([FromBody]List<TbCharging> lstCharging)  
  9. {  
  10.     return String.Format("{0},{1}", lstCharging[0].Name, lstCharging[1].Name);  
  11. }  
        /// <summary>
        /// 對象集合
        /// </summary>
        /// <param name="lstCharging"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PostMulti")]
        public object Post([FromBody]List<TbCharging> lstCharging)
        {
            return String.Format("{0},{1}", lstCharging[0].Name, lstCharging[1].Name);
        }

 

自定義路由

使用場景:用於方法重載,忽略方法名,自定義url

使用步驟:

1、在控制器類上方加入一個標記

[csharp] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. [RoutePrefix("api/Demo")]  
  2. public class DemoController : ApiController  
  3. {}  
    [RoutePrefix("api/Demo")]
    public class DemoController : ApiController
    {}

 

 

2、在方法中加入路由標記

[csharp] view plain copy
 
print?在CODE上查看代碼片派生到我的代碼片
  1. /// <summary>  
  2. /// 數組作為參數  
  3. /// </summary>  
  4. /// <param name="ids"></param>  
  5. /// <returns></returns>  
  6. [HttpPost]  
  7. [Route("PostArray")]  
  8. public object Post([FromBody]string[] ids)  
  9. {  
  10.     return String.Format("{0},{1},{2}", ids[0], ids[1], ids[2]);  
  11. }  
        /// <summary>
        /// 數組作為參數
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PostArray")]
        public object Post([FromBody]string[] ids)
        {
            return String.Format("{0},{1},{2}", ids[0], ids[1], ids[2]);
        }


備注:上面的api/Demo和PostArray可以自己定義名字。像我這樣寫就可以直接用 url:"/api/Demo/PostArray"來訪問了。


免責聲明!

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



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