我有一个LINQ to SQL实体,我将通过webservice调用序列化并返回JSON。
该实体上有一个我不希望被序列化的属性。为此,通常有[ScriptIgnore]
属性,如果我手动将其添加到designer.cs
文件,它的工作方式完全符合我的要求。
现在,由于设计器文件是自动生成的,我宁愿不必手动编辑它,因为任何更改都很容易被覆盖。我的问题是:有没有办法注释属性,以便在序列化时直接在DBML编辑器中排除它?
如果答案是否定的;有什么解决方案比在序列化之前手动将属性设置为null
更简洁,或者返回除了那个属性之外相同的匿名类型?在MVC.NET中,有没有办法将参数传递给JSON()
方法来修改其行为?
如果以前曾经问过我,我很抱歉 - 我希望这是一个常见问题,但我找不到喜欢它的人。
答案 0 :(得分:2)
所有DBML生成的类都是部分类,因此您可以在另一个文件中扩展它们。 DBML设计器只会更改Designer.cs
文件中的类。从DBML设计器中删除该属性,并将其放在另一个文件的分部类中。然后,您可以添加您希望的任何额外属性,DBML设计者将不管它。您将不得不手动管理此属性并更新它以匹配任何数据库更改,但我认为如果它解决了您的问题,这可能是值得付出的代价。
答案 1 :(得分:1)
如果您对partial
课程没有成功(这可能是最好的方法),那么您可以自己序列化日期。众所周知,ASP.NET MVC使用JavaScriptSerializer
来序列化数据。 JavaScriptSerializer
具有简单且不错的自定义功能,例如JavaScriptConverter,您可以非常轻松地将对象转换为不太标准的内容(例如,请参阅use Attr tags for json?或所有其他主题)。
为了最符合标准,您可以定义从JsonResult
派生的类(例如此处ASP.net MVC returning JSONP或http://dev.qsh.eu/Blogs/Dmitry-P/January-2010/ASP-NET-MVC-Tip--3.aspx),并将序列化数据保存在context.HttpContext.Response
中直接使用Write
方法。然后,您完全可以自由地将数据序列化为JSON。
答案 2 :(得分:0)
您可以尝试进入DBML设计器并将属性的访问修饰符从public设置为internal,而不是使用上面的partial class answer。我在表到表关系属性上执行了此操作,这样做可以在将对象序列化为JSON时消除循环引用。