Extjs 自定义 Proxy 适配 Asp.net web api GET POST PUT DELETE

1.问题描述

Extjs前端向后台请求时,默认的actionMethods:{ create: 'POST', read: 'GET', update: 'POST', destroy: 'POST' },而Asp.net web api的ApiController 是{ create: 'POST', read: 'GET', update: 'PUT', destroy: 'DELETE' },并且PUT和DELETE要在URL中包含id参数,两者不兼容。

微软默认的ApiController :Values.cs如下

    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }

2.解决方法:前端自定义Proxy

Extjs是鼓励开发者自定义Proxy的,在senchacmd新建的app中就包含了Api.js,用来自定义Proxy。

关于如何自定义Proxy,可以看这篇文章。

我自定义的Proxy代码如下:

Ext.define('App.proxy.API', {
    extend: 'Ext.data.proxy.Ajax',
    alias: 'proxy.api',

    directionParam: null, 
    filterParam: null, 
    groupDirectionParam: null, 
    groupParam: null, 
    limitParam: null, 
    pageParam: null, 
    sortParam: null, 
    startParam: null,

    controller: '',     
    
    api: { 
        create: '/api/{controller}', 
        read: '/api/{controller}/{id}', 
        update: '/api/{controller}/{id}', 
        destroy: '/api/{controller}/{id}' 
    }, 
    actionMethods :{
        create:'POST',
        read:'GET',
        update: 'PUT',
        destroy: 'DELETE'
    },

    buildUrl: function(request) { 
        var url = this.callParent(arguments); 
 
        return this.replaceTokens(url, request); 
    }, 
 
    replaceTokens: function(str, request) { 
        var me = this; 
 
        return str.replace(/{(.*?)}/g, function(full, token) { 
            // We read the id from the request params, the contoller is read from the proxy itself 
            var tokenval = "";
            if(request.params && request.params[token]){
                tokenval = request.params[token];
            }else if(me[token]){
                tokenval = me[token];
            }else if(request.getAction()=='destroy' || request.getAction()=='update'){
                var records = request.getRecords();
                if(records && records.length){
                    tokenval = records[0].id;
                }
            }//从提交的记录(payload)中找到id,放到url中.
            return tokenval; 
        }); 
    },

    headers: { Authorization: localStorage.getItem('auth') },

    reader: {
        type: 'json'
    },
    writer:{ writeAllFields:true }
});

主要逻辑就是构造url,使PUT、DELETE时url能够带上参数id。

3.效果及待改进的地方

成功适配了GET,GET(id),Post;以及单条修改 PUT 和单条删除 DELETE

待改进的地方:前端Store如果批量提交 PUT、DELETE,可能存在问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值