另一種選擇(和我個人的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