gpt4 book ai didi

data-binding - Asp.Net Core Model绑定(bind),如何获取空字段绑定(bind)为空字符串?

转载 作者:行者123 更新时间:2023-12-04 17:43:45 31 4
gpt4 key购买 nike

如果提交了如下表格,并且 MyField在表单上留空,则默认情况下 Asp.Net Core 模型绑定(bind)会将 null 放入模型的相应属性中,如下所示。

示例表格

 <form asp-controller="SomeController" asp-action="SomeAction">
<label asp-for="MyField">My Field</label><input asp-for="MyField" type="text" />
<button type="submit">Submit</button>
</form>

示例模型
 public class MyModel{
public string MyField { get; set; }
}

示例操作方法
    [HttpPost]
public IActionResult Post(MyModel m) {
//m.MyField will be null if the field was left empty
//but I want it set to a blank string by the model binder
}

但是,由于 MyField实际上是在 Http Post 正文中传输的,我希望模型绑定(bind)器设置 MyField将模型上的属性设置为空白字符串,而不是将其设置为 null。我更愿意为 MyField 的情况保留 null不在 Http Post 正文中传输。如何更改模型绑定(bind)器以显示此行为?

最佳答案

研究 SimpleTypeModelBinder 的 ASP.NET Core 代码在 https://github.com/aspnet/Mvc/blob/rel/1.1.3/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/SimpleTypeModelBinder.cs我可以看到有一个 ModelMetadata.ConvertEmptyStringToNull默认情况下设置为 true 的设置会导致空白字符串在数据绑定(bind)时转换为 null。但是该属性是只读的,所以起初我不知道如何更改它的值。
@rsheptolut 在此页面上的帖子 https://github.com/aspnet/Mvc/issues/4988引导我找到解决方案。
解决方案:
该值必须在启动时设置。这可以通过这个类来完成:

public class CustomMetadataProvider : IMetadataDetailsProvider, IDisplayMetadataProvider {
public void CreateDisplayMetadata(DisplayMetadataProviderContext context) {

if (context.Key.MetadataKind == ModelMetadataKind.Property) {

context.DisplayMetadata.ConvertEmptyStringToNull = false;
}
}
}
当它连接到 ConfigureServices 中的 MvcOptions 时startup.cs 文件的方法像这样
services.AddMvc()
.AddMvcOptions(options => options.ModelMetadataDetailsProviders.Add(new CustomMetadataProvider ()));
现在在站点范围内,回发的空白字段的默认设置是数据绑定(bind)器将相应的模型属性设置为空白字符串而不是 null。是的!

关于data-binding - Asp.Net Core Model绑定(bind),如何获取空字段绑定(bind)为空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44376540/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com