在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 }, // ...... });
好了,这个演示就写到这里,更多细节请查看用户手册。