public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request,MediaTypeHeaderValue mediaType) { //所需的对象属性 var includingFields = request.GetRouteData().Values["fields"]; if (includingFields != null && !string.IsNullOrEmpty(includingFields.ToString())) { FieldsJsonMediaTypeFormatter frmtr = new FieldsJsonMediaTypeFormatter(); frmtr.CurrentRequest = request; var resolve = new Share.IncludableSerializerContractResolver(this.SerializerSettings.ContractResolver as Share.IgnorableSerializerContractResolver); //type.IsAssignableFrom(typeof(IEnumerable<Model.dr_pre_visit>)) if (type.GetInterface("IEnumerable") != null) { resolve.Include(type.GenericTypeArguments[0], includingFields.ToString(), ','); } else { resolve.Include(type, includingFields.ToString(), ","); } frmtr.SerializerSettings = new JsonSerializerSettings { ContractResolver = resolve, }; return frmtr; } else { return this; } }
public static void Register(HttpConfiguration config) { //----------- Web API configuration and services ----------- //如果不需要XML格式的数据,则去掉下面的注释 //config.Formatters.Remove(config.Formatters.XmlFormatter); //JSON 格式化 config.Formatters.Remove(config.Formatters.JsonFormatter); var jsonFormatter = new FieldsJsonMediaTypeFormatter(); #region SerializerSettings var jsonResolve = new Share.IgnorableSerializerContractResolver(); jsonResolve.Ignore(typeof(Model.md_user), "loginpwd"); jsonResolve.Ignore(typeof(Model.dr_visit), "pkid"); jsonFormatter.SerializerSettings = new JsonSerializerSettings { ContractResolver = jsonResolve, }; #endregion config.Formatters.Add(jsonFormatter); //----------- Web API routes ----------- config.MapHttpAttributeRoutes(); /* 注意 * * 1) * 只能定义(最多)一个符合以下条件的函数 * a)相同 GET/POST/PUT/DELETE动作的, * b)只有一个名为id的参数 * 也就是,当定义类似SomeFunction(int id)的函数时,就需注意了。 * * 2) * 只能定义(最多一个)具有相同动作的无参函数,如Get()和GetSome() 会造成冲突 * * 3)可空的参数也参与路由选择 * 例如 SomeFunction(int? p1) * 如果 使用api/action/SomeFunction,不能进行路由 * 要使用api/action/SomeFunction?p1=10 * 或者 api/action/SomeFunction?p1 **/ config.Routes.MapHttpRoute( name: "ActionMethod", //如果使用 "api/{controller}/{action}",则DefaultApi就被覆盖 //所以使用了"api/{controller}/action/{action}" //{fields}:指定返回所需对象的属性,多个属性用","(逗号)隔开 routeTemplate: "api/{controller}/action/{action}/{fields}", defaults: new { action = RouteParameter.Optional, fields = RouteParameter.Optional } ); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }