国外某牛人的JsonModelBinder 实现 MVC 3.0

首先,实现一个json model binder ,判断所有的数据,如果是包含指定contentType的json 则进行 转换

 

复制代码
     public class JsonModelBinder : DefaultModelBinder
     {
         
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
         {

             
if (!IsJSONRequest(controllerContext))
             {
                 
return base.BindModel(controllerContext, bindingContext);
             }


             
// Get the JSON data that's been posted
             var request = controllerContext.HttpContext.Request;
             var jsonStringData 
= new StreamReader(request.InputStream).ReadToEnd();
                
return new JavaScriptSerializer().Deserialize(jsonStringData, bindingContext.ModelMetadata.ModelType);
             
         }

         
private static bool IsJSONRequest(ControllerContext controllerContext)
         {
             var contentType 
= controllerContext.HttpContext.Request.ContentType;
             
return contentType.Contains("FTchinaMVC/json");
         }
     }
复制代码

然后 全局注册

复制代码
 protected void Application_Start()
        {
            
ModelBinders.Binders.DefaultBinder = new JsonModelBinder();
           
 RegisterRoutes(RouteTable.Routes);
        }
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
复制代码

最后是ajax 客户端的一种实现,以Extjs为例子

 

复制代码
        Ext.Ajax.defaultPostHeader = 'FTchinaMVC/json';          
        Ext.Ajax.request({
        url: '/master/Create',
            method: "post",
            success: function (response, opts) {
                
if (response.responseText) {
                    winFormAddMaster.hide();
                    store.load();
                    Ext.Msg.alert(
'系统提示'"成功");
                } 
else {
                    Ext.Msg.alert(
"系统提示"'失败');
                }
            },
            failure: function () {
                Ext.Msg.alert(
'系统提示''Failure');
            },
            
params: Ext.encode(FormAddMaster.form.getValues()) //以json的形式发送到action
        });

 

复制代码

 

 对应Action,可以做判断是否来自Ajax提交,返回给Ajax更多有用的信息。

 

复制代码
 [HttpPost]
        
public ActionResult Create(Master master)
        {


            
if (ModelState.IsValid)
            {
                db.Master.Add(master);
                db.SaveChanges();
                
               if (!Request.IsAjaxRequest())
                {
                    return RedirectToAction("Index");
                }
                else
                {
                    Response.Write("来自ajax提交");
                    Response.End();
                    return null;
                }

            }

            
return View(master);
        }

 

              
 

复制代码

 

语言en>zh YahooCE
没有做改动。但是
posted @   大大宝  阅读(660)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示