另一种选择(和我个人的pereference)是简单地把System.Web.Script.Serialization.ScriptIgnoreAttribute
上,你不希望序列化的模型类的成员(或创建一个隐式转换DTO类做同样的事情) 。
例:
using System.Web.Script.Serialization;
public class User
{
[ScriptIgnore]
public int ID { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
这样,你并不需要定义一个特殊的接口,你可以把这个元数据就在你的模型。
更新:显然,这不是一种选择,因为类是一个派生类,它是从应该被隐藏的(不可修改)基类成员。
它是可能以您想要的方式动态生成类,可以使用Emit
或动态代理库(如Castle),但这会非常麻烦。如果可以的话,我真的建议使用一个简单的代理类,而不是:
public class UserResult
{
public UserResult(User user)
{
Username = user.Username;
Password = user.Password;
}
public string Username { get; set; }
public string Password { get; set; }
}
或者,如果你真的不能保持这种处理,你可以建立一个“通用”代理实例化:
static class ProxyInstantiator
{
public static TProxy CreateProxy<TProxy>(object source)
where TProxy : new()
{
TProxy proxy = new TProxy();
CopyProperties(source, proxy);
return proxy;
}
protected static void CopyProperties(object source, object dest)
{
if (dest == null)
{
throw new ArgumentNullException("dest");
}
if (source == null)
{
return;
}
Type sourceType = source.GetType();
PropertyInfo[] sourceProperties =
sourceType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
Type destType = dest.GetType();
PropertyInfo[] destProperties =
destType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
var propsToCopy =
from sp in sourceProperties
join dp in destProperties on sp.Name equals dp.Name
select new { SourceProperty = sp, DestProperty = dp };
foreach (var p in propsToCopy)
{
object sourceValue = p.SourceProperty.GetValue(o, null);
p.DestProperty.SetValue(dest, sourceValue, null);
}
}
}
然后,你可以写一个简单的代理类(不是接口):
public class UserResult
{
public string Username { get; set; }
public string Password { get; set; }
}
而且在这样的控制器方法调用它:
谨慎的关于这个字:
这并不不考虑到索引的属性,如果有任何这些将失败。它没有考虑到“深层复制” - 如果你的源类包含引用类型,它只会复制引用 - 也许这就是你想要的,也许它不是。
就个人而言,我会采取前一种方法,只是建立个别代理类而不使用通用代理,因为如果我犯了一个错误,我宁愿编译时错误超过运行时错误。但你问,所以你去!
你的问题是什么? – jason 2010-01-10 19:44:23
我编辑了我的问题!对不起。 – 2010-01-10 19:52:38
查看http://stackoverflow.com/questions/1302946/asp-net-mvc-controlling-serialization-with-jsonresult – Jacob 2010-01-10 19:53:38