我的Ajax服务端框架 - (1) JS直接调用C#方法

返回到目录:晒晒我的Ajax服务端框架

在Ajax网站中,Javascript经常需要请求服务器,比如:提交一个小的状态修改请求,获取某个对象的JOSN字符串,获取一小段HTML,等等。

FishWebLib的Ajax服务端框架提供的这个功能将让您可以在Javascript直接调用一个C#方法,用来完成上述需求。示例代码如下:

C#方法

namespace MyLab.AjaxService
{
    /// <summary>
    /// Ajax服务类,提供“商品记录”相关操作
    /// </summary>
    public class AjaxProduct
    {
        public int ChangeProductQuantity(int productId, int quantity)
        {
            if( productId < 0 )
                throw new MyMessageException("没有指定ProductID");

            return BllFactory.GetProductBLL().ChangeProductQuantity(productId, quantity);
        }
    }
}

说明:对于方法的参数个数,以及返回值的类型,本框架并没有特别的限制,可以根据您的要求随意指定。
示例代码中虽然将返回值定义为int类型,你完全可以使用其它的类型,甚至没有返回值。

Javascript调用代码

function SetQuantityTextboxEvent(){
    $("input.quantityTextbox").change(function(){
        var j_textbox = $(this);
        var recId = j_textbox.attr("pid");
        var newValue = j_textbox.val();

        $.ajax({
            dataType: "text", type: "POST",
            url: "/AjaxProduct.ChangeProductQuantity.cs",
            data: {productId: recId, quantity: newValue  },
            success: function (responseText) {
                // ............
            }
        });
    });
}

C#方法的参数形式

上面示例代码中包含二个参数:productId和quantity。
事实上,也可以是自定义的类型,但需要将productId和quantity定义成属性或者字段,访问性请设置为public
此时完全不要修改JS代码。

C#方法可以是实例方法,也可以是静态方法。类可以是静态,也可以是非静态的。

由于".cs" 文件是不能直接访问的,所以还需要以下配置:

<httpHandlers>
    <add verb="*" path="*.cs" validate="false" type="FishWebLib.Ajax.AjaxMethodV2Handler, FishWebLib, 
		Version=3.0.0.0, Culture=neutral, PublicKeyToken=04db02423b9ebbb2"/>
</httpHandlers>

或者不使用以上配置,但需要一个 ashx 处理器

public class ajax : IHttpHandler
{
    // 说明:
    // 在本网站的示例中,有些JS调用的URL诸如:url: "/AjaxOrder.AddOrder.cs"
    // 由于 ".cs"这种扩展名一般是被Asp.net禁止访问的。
    // 所以如果您没有机会修改IIS级别的设置或者Web.config,则不能使用上面的格式,
    //
    // 而只能使用这种格式的URL了:url: "handler/ajax.ashx?class=AjaxOrder&method=AddOrder"
    // URL参数中的 class 的含义是:指定要调用哪个Ajax服务类(包含命名空间), method 的含义是:指定要调用哪个方法。
    //
    // 这也是当前文件"ajax.ashx"存在的意义了。
    // 在这个文件中,只需要简单的“转发”一下调用就可以了。
    // 
    // 如果你觉得 class, method 这二个参数的名称不恰当,也可以用这种方法来“重定义”,
    // 最后可以调用 FishWebLib.Ajax.MethodExecutor.ProcessRequest(HttpContext context, Type type, string method)
    // 或者:ProcessRequest(HttpContext context, string AssemblyName, string className, string method)


    // assemblyName 指定了所有供Ajax可以调用的类型的程序程序集。
    private static readonly string assemblyName = typeof(MyLab.AjaxService.AjaxCustomer).Assembly.ToString();
    
    public void ProcessRequest (HttpContext context) {
        // 转发调用。第二个参数是说:要调用的类在哪个程序集中。
        // 这个重载要求在URL参数中存在这二个参数项:class, method
        FishWebLib.Ajax.MethodExecutor.ProcessRequest(context, assemblyName);
    }

}

Javascript调用代码

$.ajax({
    url: "ajax.ashx?class=AjaxProduct&method=ChangeProductQuantity", 
    data: {productId: recId, quantity: newValue  },
    // ......
});

好了,这个演示就写到这里,更多细节请查看用户手册。

返回到目录:晒晒我的Ajax服务端框架

点击此处进入示例展示及下载页面

你可能感兴趣的:(Ajax)