我正在使用从客户端脚本调用的.net脚本服务,它运行得非常好。
唯一的问题是 - 它会生成一个' __ type'每个返回对象的属性,我不想要或不需要 我在网上看到了一些关于此事的帖子,据我所知,只有'变通办法'为此:
有些人建议隐藏返回类型的无参数c'内部受保护',
其他人建议不要使用[ScriptMethod]标记,而是手动JSONfy结果并返回一个字符串。
我想知道是否还有另一个更好的解决方案。顺便说一下 - 无论如何,这个属性是什么用的? 我附上了服务方法和生成的JSON。
方法:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
public IEnumerable<EmployeePO> GetEmployeesForDepartment(int DepartmentId)
{
return new AdministrationController().GetEmployeesForDepartment(DepartmentId);
}
JSON返回:
{"d":[{"__type":"Application.Controllers.PresentationObjects.EmployeePO","Positions":[{"__type":"Application.Controllers.PresentationObjects.PositionPO","Id":4,"Name":"Employee: 1test Position 1","IsPriority":false,"WarningThreshold":50,"CriticalThreshold":60,"CurrentWaitingTime":-1,"Passengers":[],"Qualifications":[...
答案 0 :(得分:3)
好的,所以我最终接受了Jhon Morrison的建议,发布在@Kid链接的问题上 我将我返回的类中的所有无参数构造函数定义为受保护的内部,这确实起到了作用 在我实际需要创建空对象的情况下,我创建了一个Factory方法,如下所示:
public class MyClass
{
public int Id { get; set; }
/*...*/
public MyClass(int id):
{
Id = id;
}
public static MyClass CreateNewZonePO()
{
return new MyClass();
}
//parameterless c'tor for serialization's sake
//it's protected internal in order to avoid the "__type" attribute when returned from a web service. see http://stackoverflow.com/questions/4958443/net-script-web-services-type-attribute
protected internal MyClass()
{
}
}
@ Kid的答案也有效,但这样看起来比较干净。
答案 1 :(得分:2)
我注意到作为对象返回的匿名类型根本不会产生__Type属性。由于不同的原因,我已经返回了一些像这样的对象,Javascript不关心,它喜欢匿名类型。所以我想我会开始转换许多其他类型,将它们转换为所有对象继承的基础对象。服务层将处理这个,因为我喜欢传递强类型,并且不想在最后一刻之前将其转换。这个演员需要时间吗?大概。这值得么?吉兹,我不知道。我同意,出于安全原因,这些信息不应该在那里。来吧微软。
答案 2 :(得分:0)
如果您将返回类型从IEnumerable<EmployeePO>
更改为IEnumerable<Object>
,则__type
字段不会添加到JSON字符串中。
答案 3 :(得分:0)
我做的有点不同,对我来说有点清洁。 (我不想试图删除之前的答案,只是尝试添加/减少所需的编码量。)
public class MyClass
{
private MyClass(int id) { } //needs to have a constructor with at least one parameter passed to it. Update: looks like this is not needed. I still need to test this some more though.
protected internal MyClass() { } //this actually drives the restriction on the JSON return of the __type attribute and is an overload constructor
}