基于Ajax表單提交及后臺(tái)處理簡(jiǎn)單的應(yīng)用
首先先說(shuō)下表單提交吧,要提交表單那么就得先收集表單數(shù)據(jù)(至于驗(yàn)證這個(gè)我就不說(shuō)了,要說(shuō)留下下次吧),有了jquery取個(gè)html的值還是簡(jiǎn)單$("xxid").val()等就完了,但如果一張表單收集的數(shù)據(jù)很多,像這樣的表單又有很多張,那用此方法肯定麻煩死,并且容易眼花錄錯(cuò)。所以,我們就可以簡(jiǎn)單的來(lái)定義一個(gè)收集規(guī)則,如在要回傳到服務(wù)器的數(shù)據(jù)表單控件,可以做個(gè)標(biāo)記,到時(shí)取的時(shí)候把這些標(biāo)記的數(shù)據(jù)一起取回去。
就拿最簡(jiǎn)單的文體輸入做例子吧<input type="text" id="txtcode" name="txtcode" datafield="Code" style="width: 200px" />我們加一個(gè)"datafield"屬性,存入的值為對(duì)應(yīng)服務(wù)器相關(guān)類(lèi)的屬性名。有了這標(biāo)記前臺(tái)取數(shù)據(jù)就好辦了。
我們可以定個(gè)通用方法如下面代碼
getFormData: function(formid) { var data = {}; //獲取TEXT文件內(nèi)容 $("#" + formid + " input[type=text]").each(function(i, o) { var jo = $(o); if (jo.attr("datafield")) { var str = jo.val(); str = str.replace(" ", ""); if (str !== "") { data[jo.attr("datafield")] = jo.val(); } } }); return data; }
這里就是一個(gè)簡(jiǎn)單的獲取表單里面所有text文本,并放入到一個(gè)data對(duì)象里面,至于其它表單控件值怎么取我就不多說(shuō)了,原理差不多。
那么接下回就是把數(shù)據(jù)發(fā)到服務(wù)器上了,我這里就直接用jquery帶的ajax。
var save = function(sender) { $(sender).prop("disabled", true); //禁用按鈕,防止重復(fù)發(fā)送 var data = getFormData("form1"); var jsonobj = { jsondata: data }; var textdata = JSON.stringify(jsonobj); $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "xxxxx.aspx/Save", dataType: "json", data: textdata, success: function(msg) { if (msg.d == "1") { document.form1.reset(); alert("保存成功!"); } else if (msg.d == "0") { alert("保存失??!"); } }, complete: function(jqXHR, textStatus) { $(sender).prop("disabled", false); //還原按鈕 } }); }
這里的"xxxxx.aspx/Save"就是ajax處理頁(yè)面,其它就是一個(gè)webmethod。做了一下防止客戶手速太快,服務(wù)處理太慢,重復(fù)點(diǎn)擊的處理。
這樣一個(gè)表單數(shù)據(jù)收集,回傳服務(wù)器就完成了。這里使用json2.js的JSON.stringify方法統(tǒng)一將對(duì)象轉(zhuǎn)成json字符,好處就是不用自己為拼json字符串而考慮json的格式問(wèn)題,簡(jiǎn)單干凈。
那么客戶已經(jīng)把數(shù)據(jù)收錄好了,服務(wù)器也該要處理數(shù)據(jù)了。我們從前臺(tái)來(lái)的數(shù)據(jù)的鍵(json的key),不可能全部包括某個(gè)數(shù)據(jù)類(lèi)的所有屬性。并且數(shù)據(jù)類(lèi)也有很多個(gè),應(yīng)該是哪一個(gè)類(lèi)只有服務(wù)器才知道。所以這里我們就需要寫(xiě)一個(gè)幫助的轉(zhuǎn)換類(lèi)。這里又有問(wèn)題,有可能數(shù)據(jù)類(lèi)有很多個(gè),難道我要為每一個(gè)類(lèi)寫(xiě)一個(gè)方法,那不是個(gè)坑么?所以我們分析下客戶端傳到服務(wù)端上的數(shù)據(jù)格式,它是一組鍵值對(duì)且不會(huì)重復(fù),那么就相當(dāng)于一個(gè)Dictionary<string, string>,后臺(tái)的類(lèi)有很多種,那么至少我們能確定一個(gè)傳入?yún)?shù)了,傳出的就是相關(guān)類(lèi)。相關(guān)類(lèi)?到底是哪一類(lèi)還只有到了具體后臺(tái)收集方法里才知道。那么,整理一下思路,現(xiàn)在有一個(gè)Dictionary<string, string>要變成一個(gè)數(shù)據(jù)類(lèi),數(shù)據(jù)類(lèi)到底是什么有什么樣的屬性?搞不清,但這個(gè)Dictionary<string, string>的key(鍵)可以看做是這個(gè)數(shù)據(jù)類(lèi)屬性集的一個(gè)子集,而這個(gè)Dictionary<string, string>的value(值)是這個(gè)數(shù)據(jù)類(lèi)屬性值toString()的子集。那樣這樣就好辦了。屬性集怎么???反射。這么多類(lèi)到底是哪個(gè)?不管它,泛型解決。
說(shuō)下這么多,貼下核心代碼
public static T1 UpdateObjectByDic<T1>(T1 scrobj, IDictionary<string, string> sourceobject, bool ignoreCase) where T1 : new() { T1 result = scrobj; PropertyInfo[] pifresults = typeof(T1).GetProperties(); foreach (var dic in sourceobject) { foreach (PropertyInfo pifresult in pifresults) { if (string.Compare(dic.Key, pifresult.Name, ignoreCase) == 0) { pifresult.SetValue(result, ChangeType(dic.Value, pifresult.PropertyType), null); break; } } } return result; } public static Object ChangeType(object value, Type targetType) { Type convertType = targetType; if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { NullableConverter nullableConverter = new NullableConverter(targetType); convertType = nullableConverter.UnderlyingType; } return Convert.ChangeType(value, convertType); }
我這里T1 scrobj是把更新做在一起,如添加表單就傳個(gè)new的對(duì)象進(jìn)來(lái),如果是更新把單就把原表單數(shù)據(jù)傳進(jìn)來(lái)。這里順帶說(shuō)下ChangeType方法,其它就是數(shù)據(jù)類(lèi)里有些屬性是nullable的(int? DateTime?等)傳統(tǒng)的Convert.ChangeType會(huì)有異常所以就簡(jiǎn)單改了下,ignoreCase就是屬性(前臺(tái)那個(gè)datafield對(duì)應(yīng)的值)查找是否處理大小寫(xiě)(一般是不管大小寫(xiě)的,要管大小寫(xiě)相信會(huì)被前臺(tái)口水流淹死)。
這樣后臺(tái)數(shù)據(jù)處理核心就完了,調(diào)用部分代碼也貼下
[WebMethod(EnableSession = true)] public static string Save(Dictionary<string, string> jsondata) { string result = "0"; Model.Project pro = ConvertHandle.UpdateObjectByDic< Model.Project>(jsondata,new Model.Project,true); pro.CreatorID = BLL.Sys_User.GetCurUser().ID.ToString(); pro.CreatorName = BLL.Sys_User.GetCurUser().Name; prohandle.Insert(pro); result = "1"; return result; }
這里就是后臺(tái)具體處理方法調(diào)用的核心使用了,prohandle.Insert(pro)將類(lèi)存入數(shù)據(jù)庫(kù),pro.CreatorID,pro.CreatorName為項(xiàng)目的一些其它信息,這些就不說(shuō)了。到這里一個(gè)表單前臺(tái)數(shù)據(jù)收集,后臺(tái)處理,除了保存那塊以外,就都算完了,呵呵。
文章最后說(shuō)下,這里只是個(gè)簡(jiǎn)單應(yīng)用,像我說(shuō)的這前臺(tái)收集,很多前臺(tái)js框架都已經(jīng)早做了,考慮方面也比我這個(gè)全面得多,后臺(tái)處理我這是基于我這種前臺(tái)簡(jiǎn)單收集弄的,很多第三方框架都有完整的體系了,但我這里說(shuō)的只是一種簡(jiǎn)單的思路,當(dāng)你一時(shí)沒(méi)有那么多控件時(shí)是否能把這一條路簡(jiǎn)單走通實(shí)現(xiàn)。當(dāng)然我強(qiáng)烈建議不要重復(fù)造輪子,但要一定要明白輪子的核心作用和原理。
以上這篇基于Ajax表單提交及后臺(tái)處理簡(jiǎn)單的應(yīng)用就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
ajax傳遞一個(gè)參數(shù)具體實(shí)現(xiàn)
ajax傳遞一個(gè)參數(shù)或多個(gè)參數(shù)在使用過(guò)程中由于特殊需求經(jīng)常會(huì)用到,下面與大家分享下具體的實(shí)現(xiàn)方法,感興趣的朋友可以參考下哈2013-05-05ajax設(shè)置async校驗(yàn)用戶名是否存在的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇ajax設(shè)置async校驗(yàn)用戶名是否存在的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08本人ajax留言板的源程序 不錯(cuò)的應(yīng)用js
本人ajax留言板的源程序 不錯(cuò)的應(yīng)用js...2007-09-09無(wú)限分級(jí)和tree結(jié)構(gòu)數(shù)據(jù)增刪改【附DEMO下載】
這篇文章主要介紹了無(wú)限分級(jí)和tree結(jié)構(gòu)數(shù)據(jù)增刪改的相關(guān)資料,需要的朋友可以參考下2016-05-05ajax 自動(dòng)完成下拉框 自動(dòng)提示位置問(wèn)題
ajax 自動(dòng)完成下拉框 自動(dòng)提示位置問(wèn)題...2007-02-02AJax 學(xué)習(xí)筆記二(onreadystatechange的作用)
初次接觸onreadystatechange這個(gè)事件句柄不知道有何用處,看過(guò)一篇文章的介紹之后,終有大致所了解。2010-04-04jQuery使用ajax跨域請(qǐng)求獲取數(shù)據(jù)
跨域這個(gè)詞應(yīng)用非常頻繁,主要是因?yàn)榘踩拗?同源策略, 即JavaScript或Cookie只能訪問(wèn)同域下的內(nèi)容)。本文給大家介紹jQuery使用ajax跨域請(qǐng)求獲取數(shù)據(jù),需要的朋友可以參考下2015-10-10Ajax校驗(yàn)是否重復(fù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Ajax校驗(yàn)是否重復(fù)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03