ext.net 后台方法调用

大家知道EXT.NET可以和MVC一起使用,就没有CS页,全部靠JS或者控制域来操作。

另外一种是有CS页面,直接可以后台操作。下面我们就先来说一下直接后台操作的一些注意事项:

首先我们前面提到每个页面都必须添加一个<ext:ResourceManager ID="ResourceManager1" runat="server" DirectMethodNamespace="extHT" /> 才能使用EXT.NET。我相信很多人和我一样,不知道这个有什么作用。看到看到我给ResourceManager的名称空间是extHT   的这个名称空间。

当我们需要调用后台一些方法的时候,这个名称空间就尤为重要。如下:

假如我们建了一个<ext:Panel,有一个字段 <ext:Column ID="type" runat="server" Text="用户类型" Width="100" DataIndex="FSystemId">
                                <Renderer Fn="getValue"></Renderer>
</ext:Column> 需要转换一下,我想一般这个用户类型我们都是存的ID吧。根据ID在到配置表里把对应的类型名称找出来。

JS方法如下(注意看红色地方):

var getValue = function (value) {
            var result = extHT.getUserType(value);
            debugger;
            //try { alert("b:" + result.xhr.responseText + "   a:" + result.responseXml); } catch (e) { }//这个是调试代码,看看返回是不是对的。
            return result.xhr.responseText;

    //这一块是在类型比较少,且已知的情况下可以简单的处理,如果是很多且未知 我们还是需要到后台进行数据库查询来处理
            //switch (value) {
            //    case "220":
            //        return "<span>XXXXXX</span>"
            //        break;
            //}
        }
    </script>

CS后台代码(注意红色的地方):

[DirectMethod]
    public string getUserType(string value)
    {
        string type = "";
        if (value == "220") { type = "<span>XXXXX</span>"; }

        //等等一系列的操作
        return type;
    }


由上我们可以看出EXT.NET需要调用到后台代码的时候我们必须根据ResourceManager的名称空间来。所以大家在取名字的时候还是上点心。

或许有的人会觉得每个页面都去定义个好麻烦,那有没有在什么地方配置后全部都用那个名称呢?不用每个页面去定义。当然是有的了,在web.config中添加节点<extnet theme="Neptune" directMethodNamespace="MyApp.DirectMethods" />这样,我们调用的时候之前的代码extHT.getUserType就可以改为:App.direct.getUserType。

当然我们还可以在后台代码更改名称空间:[DirectMethod(Namespace = "MyApp.DirectMethods")]

我们还可以在调用后台代码加一些回调函数:

function fnUpdate() {
    MyApp.DirectMethods.getUserType(5, {
        success: onSuccess,
        failure: onFailure,
        eventMask: { showMask: true }
    });
}


function onSuccess() {
    alert("成功");
}

function onFailure() {
    alert("失败");
}

在这段代码中,我们在调用DirectMethod方法的时候添加了一些配置,包括执行成功和失败的回调方法,以及来显示一个遮罩层。


一般情况下我们都是采用异步的方式来执行服务器端的方法,这样能够获得更好的用户体验,当然,如果你有怪癖,希望能够通过同步的方式来执行服务器端方法,Ext.Net DirectMethods也是支持的。[DirectMethod(Namespace = "MyApp.DirectMethods", Async = false)]即可。

由上可以看出是很简单的一个设置,在DirectMethod构造函数中配置一下就可以了。
郑重的提醒,尽量少用同步的请求,这样会造成浏览器假死的现象,如同2014年春运时候抢火车票的情况。


静态和非静态方法

静态方法很简单:

[DirectMethod(Namespace = "MyApp.DirectMethods", Async = false)]
public void AddToServerTime(int hours)
{
    string text = this.btnUpdate.Text;
    var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0));
    this.myLabel.Text = text + date.ToString();
}

调用直接如上fnUpdate方法调用即可。

在来说说非静态方法,在执行非静态方法的时候,Ext.Net会提交更多的数据,使我们可以访问页面中的控件这在处理页面相关内容时候非常有用,但是当我们只是想去执行一个处理过程,而与页面无关的时候,我们就可以通过执行静态方法来提升性能。
在静态方法中,我们不能访问页面的Form数据,不能直接访问Request、Response等数据(可以通过HttpContext.Current来访问),好处是在请求的时候,Ext.Net不会将页面数据提交给服务器,大大减少了数据传输和服务器执行的时间。

[DirectMethod(Namespace = "MyApp.DirectMethods")]
public static string AddToServerTime(int hours)
{
    var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0));
    return date.ToString();
}

这是我们刚才的方法,现在把它改成了静态方法。JS的调用基本没有改变,只不过我们需要在JS中来更新控件的显示了。

function fnUpdate() {
    MyApp.DirectMethods.AddToServerTime(5, {
        success: onSuccess,
        failure: onFailure,
        eventMask: { showMask: true }
    });
}
function onSuccess(result) {
    App.myLabel.setText(result);
}

我们需要对onSuccess回调方法进行修改,在它接收到执行结果之后更新界面显示。


访问WebService等类似方法

DirectMethods不能直接访问WebService,但可以通过Ext.net.DirectMethod.request来请求WebService,实现类似于页面后台方法的效果。

var showRelativeServerTime = function () {
   
Ext.net.DirectMethod.request({
       
url: "EchoService.asmx/Echo",
        cleanRequest: true,
        params: {
            something: "Hello world!"
        },

        success: function (result) {
            alert(Ext.DomQuery.selectValue("string", result, ""));
        }
    });
}附加说明:这种方法受用于一切WebService、一般处理程序、MVC等通过url访问的东东,非常好用。



发布了83 篇原创文章 · 获赞 8 · 访问量 10万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览