我有以下控制器(缩写):
public class ServicesController : Controller
{
private readonly IServiceRepository _repo;
public ServicesController(IServiceRepository repo)
{
_repo = repo;
}
[HttpPost]
public async Task<StatusCodeResult> CreateService([FromBody] JsonServiceEntity service)
{
return await _repo.CreateServiceAsync(new ServiceEntity(service));
}
}
JsonServiceEntity类如下所示(缩写):
public class JsonServiceEntity
{
public string Id { get; set; } = Guid.NewGuid().ToString();
}
Id
是Guid形式的字符串。如果从客户端传入,则应使用给定的ID。如果没有从客户端传递任何值,我应该生成一个新的guid并使用它。
但是,当客户端未提供默认值时,我无法使其使用默认值。不管怎样,它最终都是一个空字符串。我可以调试并观察它是否击中了该属性,并为默认值生成了一个新的guid,该值会通过调用带有空字符串的setter迅速被覆盖。
我在NullValueHandling
的{{1}}上尝试了DefaultValueHandling
和SerializerSettings
的不同值,但这没有帮助。如果我在Startup.cs
属性上设置了[Required]
,则会收到ModelState错误,让我知道尝试的值是Id
,而不是空字符串。
如何获取默认值?
null
答案 0 :(得分:5)
假设客户端实际上传递了一个空字符串作为Id
,则可以使用DefaultValue
属性指示Json.Net将空字符串作为默认值进行处理:
public class JsonServiceEntity
{
[DefaultValue("")]
public string Id { get; set; } = Guid.NewGuid().ToString();
}
然后在JSON配置中,将其设置为Ignore
的默认值:
DefaultValueHandling = DefaultValueHandling.Ignore
答案 1 :(得分:3)
当您在自动实现的属性上指定默认值时:
select *
from
( select irart, fiben1 as "Benämning", fisald +irbant as "disp.saldo", sum(irbant) as "Lev.Best"
from triir00
left join trafi00
on irart = fiart and irfili = fifili
where IRSTYP between 00 and 02 and irlev = '2602688' and irfili = 10 and fihugr = 5
group by irart,fiben1,irlev,fisald,irbant
) as antalLev
full join
( select raart, fiben1 as "Benämning", raorn9 as "Ordernummer", fisald- raanta as "Disp.Saldo", sum(raanta) as "Kund.Best"
from trora00
left outer join trohu00
on huorn9 = raorn9
left join trafi00
on raart = fiart and rafili = fifili
where rastyp <= 02 and rafili <> 0 and raotyp = 1 and ralev1 = '2602688' and fihugr = 5
group by raart,fiben1,raorn9,fisald,raanta
) as antalBest
on antalLev.irart = antalBest.raart
仅在未设置任何值的情况下使用默认值。在此,如果客户端未设置ID,则根本不应该发送ID,即:
如果这是您当前的JSON:
public string Id { get; set; } = Guid.NewGuid().ToString();
那么客户端应该发送的是:
{
"id": "",
"name": "foo"
}
然后,将根据需要使用默认值。如果您无法实现此目的,或者只是想处理客户端错误地发送空字符串的情况,那么您将需要一个自定义的getter和setter:
{
"name": "foo"
}