国外某牛人的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");
}
}
{
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);
{
ModelBinders.Binders.DefaultBinder = new JsonModelBinder();
RegisterRoutes(RouteTable.Routes);
}
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
最后是ajax 客户端的一种实现,以Extjs为例子
Ext.Ajax.defaultPostHeader = 'FTchinaMVC/json';
Ext.Ajax.request({
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
});
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();
}
return View(master);
}
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 RedirectToAction("Index");
}
else
{
Response.Write("来自ajax提交");
Response.End();
return null;
}
}
return View(master);
}
语言en>zh YahooCE
没有做改动。但是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)