Van*_*ame 9 asp.net-web-api breeze
我很难理解如何将Enum值转换为它的相应名称.我的模型如下:
public class CatalogRule
{
public int ID { get; set; }
[Display(Name = "Catalog"), Required]
public int CatalogID { get; set; }
[Display(Name = "Item Rule"), Required]
public ItemType ItemRule { get; set; }
public string Items { get; set; }
[Display(Name = "Price Rule"), Required]
public PriceType PriceRule { get; set; }
[Display(Name = "Value"), Column(TypeName = "MONEY")]
public decimal PriceValue { get; set; }
[Display(Name = "Exclusive?")]
public bool Exclude { get; set; }
}
public enum ItemType
{
Catalog,
Category,
Group,
Item
}
public enum PriceType
{
Catalog,
Price_A,
Price_B,
Price_C
}
Run Code Online (Sandbox Code Playgroud)
来自.net API的示例结果:
[
{
$id: "1",
$type: "XYZ.CMgr.Models.CatalogRule, XYZ.CMgr",
ID: 1,
CatalogID: 501981,
ItemRule: 0,
Items: "198",
PriceRule: 1,
PriceValue: 0.5,
Exclude: false
},
{
$id: "2",
$type: "XYZ.CMgr.Models.CatalogRule, XYZ.CMgr",
ID: 2,
CatalogID: 501981,
ItemRule: 2,
Items: "9899",
PriceRule: 2,
PriceValue: 10.45,
Exclude: false
}
]
Run Code Online (Sandbox Code Playgroud)
因此,在这个例子中,我需要得到官方的结果[0] .ItemRule和价格的一个成果[0] .PriceRule.我怎样才能在BreezeJS中实现这一目标?
这在ASP.NET Web API中很容易实现,因为它是默认JSON序列化程序(Json.NET)中的一个开箱即用的功能.
要在JSON中查看字符串而不是枚举数字,只需StringEnumConverter在app init期间添加一个JSON序列化程序设置的实例:
var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
Run Code Online (Sandbox Code Playgroud)
更新:是的,你没错,这对Breeze.js没有帮助.好吧,无论如何,你可以做一点魔术让枚举像字符串一样工作(而新的版本修复版没有发布).
创建一个自定义ContextProvider,将元数据中的所有整数枚举值更新为字符串.这里是:
public class StringEnumEFContextProvider<T> : EFContextProvider<T>
where T : class, new()
{
protected override string BuildJsonMetadata()
{
XDocument xDoc;
if (Context is DbContext)
{
xDoc = GetCsdlFromDbContext(Context);
}
else
{
xDoc = GetCsdlFromObjectContext(Context);
}
var schemaNs = "http://schemas.microsoft.com/ado/2009/11/edm";
foreach (var enumType in xDoc.Descendants(XName.Get("EnumType", schemaNs)))
{
foreach (var member in enumType.Elements(XName.Get("Member", schemaNs)))
{
member.Attribute("Value").Value = member.Attribute("Name").Value;
}
}
return CsdlToJson(xDoc);
}
}
Run Code Online (Sandbox Code Playgroud)
并使用它而不是EFContextProvider在您的Web API控制器中:
private EFContextProvider<BreezeSampleContext> _contextProvider =
new StringEnumEFContextProvider<BreezeSampleContext>();
Run Code Online (Sandbox Code Playgroud)
这对我来说很适合当前的Breeze.js版本(1.1.3),虽然我还没有检查其他场景,比如验证......
更新:要修复验证,请在breeze中更改枚举的数据类型.[min | debug] .js,手动(DataType.fromEdmDataType函数,dt = DataType.String;用于枚举)或在app init期间替换默认函数:
breeze.DataType.fromEdmDataType = function (typeName) {
var dt = null;
var parts = typeName.split(".");
if (parts.length > 1) {
var simpleName = parts[1];
if (simpleName === "image") {
// hack
dt = DataType.Byte;
} else if (parts.length == 2) {
dt = DataType.fromName(simpleName);
if (!dt) {
if (simpleName === "DateTimeOffset") {
dt = DataType.DateTime;
} else {
dt = DataType.Undefined;
}
}
} else {
// enum
dt = DataType.String; // THIS IS A FIX!
}
}
return dt;
};
Run Code Online (Sandbox Code Playgroud)
肮脏,肮脏的黑客,我知道......但那是我找到的解决方案
未来几天将发布一个新版本,我们将“更改”breeze 的枚举行为(即破坏有关枚举的现有代码)。在新版本中,枚举通过其 .NET 名称而不是整数进行序列化和查询。当新版本发布时,我会在这里发帖。
| 归档时间: |
|
| 查看次数: |
3987 次 |
| 最近记录: |