現在mvc採用了ModelBinder, Controller中現在可以接受很多複雜類型的參數,但是對於jquery,extjs等js架構來說,更多的是採用json格式與伺服器端傳遞參數更合理.對於簡單的參數,我們可以並不採用json格式,直接post到伺服器端.比如使用者登陸,我們只傳遞使用者名稱和密碼到Controller中:
handler : function CheckLogin() {if (form.isValid()) {var formvalue = form.getValues();Ext.Ajax.request({url : '/user.mvc/login',method : "POST",waitMsg : "請等待!",params : {userid : formvalue.UserID,password : formvalue.UserPassword},success : function(response, options) {var responseMessage = Ext.util.JSON.decode(response.responseText);if (responseMessage.Result) {win.destroy();window.location = "/Home.mvc/Index";} else {Ext.MessageBox.alert("訊息",responseMessage.Message);}},failure : function(response, options) {Ext.MessageBox.hide();Ext.MessageBox.show({title :"登陸失敗",msg : response.responseText}); }});} else {form.markInvalid();Ext.MessageBox.alert("訊息", "輸入錯誤");}}
可以看到,對於userid和password的值,並沒有採用Ext.util.JSON .encode加密成json格式字串.這對應於我們上次的UserController中的Login.但是對於傳輸實體,也就是添加使用者和更新使用者的操作時,就不會那麼容易了:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult AddUser(UserDTO User){.....}
一種方式,我們可以採用post的方式傳輸User.UserName,User.UserID這種首碼+屬性作為key的方式到Controller中,MVC通過
DefaultModelBinder就可以將值對應到實體參數中,但是這種方式就需要我們修改form的控制項的name.另外一種方式就是我們實現
IModelBinder,添加JsonModelBinder,使前台js架構傳遞json對象到Controller中解析到參數中,暫且我們只做以下簡單實現:
public class JsonBinder<T> : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var param = new DataContractJsonSerializer(typeof(T)) .ReadObject(controllerContext.HttpContext.Request.InputStream); return param; } }
同樣,我們也需要在Global的Application_Start()中進行註冊:
ModelBinders.Binders[typeof(UserDTO)] = new JsonBinder<UserDTO>();
這樣,在前台js架構,請求User.mvc/AddUser時,就可以直接傳遞Json格式的資料過來,Mvc就會自動的通過JsonBinder進行json還原序列化,
解析出UserDTO對象.相比於手動的去轉換Reqeust中的參數,現在這種實現是不是強大了很多.
var formvalue = Ext.util.JSON.encode(UserForm.form.getValues());Ext.Ajax.request({url : '/User.mvc/UpdateUser',method : 'POST',params : formvalue,callback : function(options, success, response) { if (success) { Ext.MessageBox.hide();var result = Ext.util.JSON.decode(response.responseText)Ext.MessageBox.alert("訊息",result.Message);} else {Ext.MessageBox.hide();Ext.MessageBox.alert("失敗,請重試",response.responseText);}},failure : function(response, options) {Ext.MessageBox.hide();ReturnValue = Ext.MessageBox.alert("警告","出現異常錯誤!請聯絡管理員!");},success : function(response, options) {Ext.MessageBox.hide();store.reload();}})
在前台Mvc+extjs整合這部分,對於一些內容進行了省略,比如怎麼具體的利用mvccontrib整合spring.net和mvc,以及在web層利用
log4net記錄錯誤資訊等,這些內容都可以直接通過demo程式中看到.如果發現問題,請直接和我聯絡.最後,再展示一下demo的程式的勞動成果,
漂亮的extjs介面以及demo功能.
代碼下載.
資料庫表建立指令碼.
作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。