如何将控制器配置为返回 null 而不是 Guid.Empty?



为了使我的 ASP.Net Core 2.2 API前端开发人员的生活更轻松,我希望他们接收"null"而不是Guid.Empty值(在.net核心中定义为">

000000000-0000-0000-0000-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000通过创建这样的 dtos 来实现此行为并不复杂:

public class ExampleDto
{
public Guid? Id { get; set; }
}

然后像这样映射它们

public static void MapExampleEntity(this AutoMapperProfile profile)
{
profile.CreateMap<ExampleEntity, ExampleDto>()
.ForMember(dto => dto.Id, o => o.MapFrom(e => e.Id == Guid.Empty ? null : e.Id);
}

但是,对于我认为控制器应该能够通过一些配置来处理的任务来说,这是大量的代码重复。默认情况下是否可以实现此行为?

编辑以进一步指定我的问题(我收到了几个有效的解决方案,但我觉得它们中的任何一个都不是 100% 干净的方式来实现我想做的事情(:

我知道一般的运动是留下 null,这也是我不想用 null 污染我的代码的原因。我想以这种形式保留我的 dtos:

public class ExampleDto
{
public Guid Id { get; set; }
}

而不是这种形式:

public class ExampleDto
{
public Guid? Id { get; set; }
}

以避免无限的 HasValue(( 检查。Hovewer,我认为返回以下内容的信息量更大且一致性更高(请参阅 customerId(:

{
"Id": "b3431f4d-ef87-4fb5-83e0-995a9e7c9f6a",
"Name": "A001",
"Description": null,
"Currency": null,
"CustomerId": null,
"Customer": null,
"CountryIso": 2
}

比这个:

{
"Id": "b3431f4d-ef87-4fb5-83e0-995a9e7c9f6a",
"Name": "A001",
"Description": null,
"Currency": null,
"CustomerId": "00000000-0000-0000-0000-000000000000",
"Customer": null,
"CountryIso": 2
}

这是当前的行为。这些是我想让 Guid.Empty => null 映射执行控制器而不是自动映射器(如果可能出现这种行为(的原因。

好的,不知道为什么我在这里问之前没有找到这个解决方案,但我觉得在这里写它是合适的(因为我已经问过这个问题(对于可能面临相同问题的未来开发人员。

确实可以格式化控制器输出,而无需手动检查每个 Dto 中的值或将自动映射器行添加到其映射配置中!

第一个从 JsonConvert 派生的创建类,如下所示:

public class NullGuidJsonConverter : JsonConverter<Guid>
{
public override void WriteJson(JsonWriter writer, Guid value, JsonSerializer serializer)
{
writer.WriteValue(value == Guid.Empty ? null : value.ToString());
}
public override Guid ReadJson(JsonReader reader, Type objectType, Guid existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var value = reader.Value.ToString();
return reader.Value == null ? Guid.Empty : Guid.Parse(value);
}
}

,然后将此类添加到"启动"中的 Mvc 设置中.cs

services.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.Converters.Insert(0, new NullGuidJsonConverter()))
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

就是这样!控制器现在正在处理从 Guid.Empty 值到 null 的转换!

Guid 是你已经知道的值类型。如果要发送 null 而不是 Empty Guid,可以检查 ActualCustomerId == Guid.IsEmpty,如果为 true,则 CustomerId = null。否则,正如您所说,可为空的类型是一种方法。如果这不是您想要的,请道歉。这意味着您需要检查 Guid 是否为空,如果为空,则将 null 设置为 CustomerId。

尝试:

public class ExampleDto
{
public Guid? Id { get{ return Id == Guid.Empty ? null : Id; } set; }
}

最新更新