加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

数据绑定 – Asp.Net核心模型绑定,如何将空字段绑定为空字符串?

发布时间:2020-12-16 06:50:44 所属栏目:asp.Net 来源:网络整理
导读:如果提交了类似下面的表单并且MyField在表单上保留为空白,则默认情况下,Asp.Net Core模型绑定将null置于模型上的相应属性中,如下所示. 示例表格 form asp-controller="SomeController" asp-action="SomeAction" label asp-for="MyField"My Field/labelinput
如果提交了类似下面的表单并且MyField在表单上保留为空白,则默认情况下,Asp.Net Core模型绑定将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主体中传输的,我更喜欢模型绑定器将模型上的MyField属性设置为空字符串,而不是将其设置为null.对于在Http Post主体中没有传输MyField的情况,我宁愿保留null.如何更改模型绑定器以显示此行为?

解决方法

在 https://github.com/aspnet/Mvc/blob/rel/1.1.3/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/SimpleTypeModelBinder.cs研究SimpleTypeModelBinder的Asp.Net核心代码我可以看到有一个ModelMetadata.ConvertEmptyStringToNull设置,默认设置为true,导致空字符串在数据绑定时转换为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;
                }
            }
        }

当它在startup.cs文件的ConfigureServices方法中将其连接到MvcOptions时就像这样

services.AddMvc()
        .AddMvcOptions(options => options.ModelMetadataDetailsProviders.Add(new CustomMetadataProvider ()));

现在网站范围内,回发的空白字段的默认值将是数据绑定器将相应的模型属性设置为空字符串而不是null.是啊!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读