使用嵌套类的ASP.NET MVC3 JSON模型绑定
发布时间:2020-05-24 03:12:25 所属栏目:asp.Net 来源:互联网
导读:在MVC3中,如果模型有嵌套对象,是否可以自动将 JavaScript对象绑定到模型?我的模型看起来像这样: public class Tweet { public Tweet() { Coordinates = new Geo(); } public string Id { get; set; } public string User
|
在MVC3中,如果模型有嵌套对象,是否可以自动将 JavaScript对象绑定到模型?我的模型看起来像这样: public class Tweet
{
public Tweet()
{
Coordinates = new Geo();
}
public string Id { get; set; }
public string User { get; set; }
public DateTime Created { get; set; }
public string Text { get; set; }
public Geo Coordinates { get; set; }
}
public class Geo {
public Geo(){}
public Geo(double? lat,double? lng)
{
this.Latitude = lat;
this.Longitude = lng;
}
public double? Latitude { get; set; }
public double? Longitude { get; set; }
public bool HasValue
{
get
{
return (Latitude != null || Longitude != null);
}
}
}
当我将以下JSON发布到我的控制器时,除“坐标”之外的所有内容都会成功绑定: {"Text":"test","Id":"testid","User":"testuser","Created":"","Coordinates":{"Latitude":57.69679752892457,"Longitude":11.982091465576104}}
这是我的控制器动作的样子: [HttpPost]
public JsonResult ReTweet(Tweet tweet)
{
//do some stuff
}
我在这里遗漏的东西还是新的自动绑定功能只支持原始对象? 解决方法是的,您可以使用ASP.NET MVC3绑定复杂的json对象.Phil Haack写了recently. public class Geo
{
public Geo() { }
public Geo(double lat,double lng)
{
this.Latitude = lat;
this.Longitude = lng;
}
public double Latitude { get; set; }
public double Longitude { get; set; }
public bool HasValue
{
get
{
return (Latitude != null || Longitude != null);
}
}
}
这是我用来测试它的JavaScript代码: var jsonData = { "Text": "test","Id": "testid","User": "testuser","Created": "","Coordinates": { "Latitude": 57.69679752892457,"Longitude": 11.982091465576104} };
var tweet = JSON.stringify(jsonData);
$.ajax({
type: 'POST',url: 'Home/Index',data: tweet,success: function () {
alert("Ok");
},dataType: 'json',contentType: 'application/json; charset=utf-8'
});
UPDATE 我试图用模型绑定器做一些实验,我出来了这个似乎可以使用可空类型的解决方案. 我创建了一个自定义模型binder: using System;
using System.Web.Mvc;
using System.IO;
using System.Web.Script.Serialization;
public class TweetModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
{
var contentType = controllerContext.HttpContext.Request.ContentType;
if (!contentType.StartsWith("application/json",StringComparison.OrdinalIgnoreCase))
return (null);
string bodyText;
using (var stream = controllerContext.HttpContext.Request.InputStream)
{
stream.Seek(0,SeekOrigin.Begin);
using (var reader = new StreamReader(stream))
bodyText = reader.ReadToEnd();
}
if (string.IsNullOrEmpty(bodyText)) return (null);
var tweet = new JavaScriptSerializer().Deserialize<Models.Tweet>(bodyText);
return (tweet);
}
}
我已经注册了所有类型的推文: protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ModelBinders.Binders.Add(typeof(Models.Tweet),new TweetModelBinder());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-core – ASP.NET核心查找所有程序集中的所有类类型
- asp.net-mvc – ASP.NET MVC中的非字符串角色名称?
- asp.net – 为什么网站项目中缺少global.asax
- asp.net-mvc – Azure ACS 2自定义域
- asp.net-mvc – 在bootstrap模式中使用时,MVC中的文件上载返
- 使用ASP.net MVCJQuery将HTML标签(代码)作为字符串发布
- asp.net-mvc – MVC4:禁用某些控制器上的移动视图
- asp.net-mvc-3 – 如何在剃须刀视图中设置复选框?
- ASP.NET DropDownList OnSelectedIndexChanged事件未触发
- asp.net-mvc – 传统的ASP.NET Web窗体与MVC
推荐文章
站长推荐
- asp.net-mvc – 第一个Web API会话请求非常慢
- .net – %中的含义是什么:和%=有什么区别?
- asp.net – Visual C#中事件的下拉列表在哪里?
- ASP.Net 2中的上传文件在哪里?
- asp.net-web-api – 如何在MVC4 Web API中的自定
- asp.net-mvc – 用静态项绑定Html.DropDownList
- 如何以编程方式在ASP.NET MVC中显示/隐藏Razor V
- asp.net – 什么时候调用Application_End,我该如
- asp.net – 如何确定HttpModules的执行顺序?
- 是否有比ASP.NET成员资格提供程序更现代的会员/安
热点阅读
