配置文件提供程序中 bool 类型的默认值为 null

发布于 2024-10-25 23:26:52 字数 508 浏览 3 评论 0原文

我在我的 webconfig.xml 中定义了一个自定义配置文件。我定义了此属性

<add name="sex" type="bool" serializeAs="String" defaultValue="[null]"/>

,因为数据库中存在空值。我在这段代码中得到一个空引用异常:

    ProfileCommon p = GetProfile();
            txtFirstName.Text = p.first_name;
            txtLastName.Text = p.last_name;
            txtInitial.Text = p.initial;
            txtEmail.Text = p.email;

//这会导致空引用异常 布尔? blnTest = p.sex;

这是在 webconfig 中设置默认 null 值的正确方法吗?

I have a custom profile defined in my webconfig. I have this property defined

<add name="sex" type="bool" serializeAs="String" defaultValue="[null]"/>

as there are null values in the database. I get a null reference exception in this code:

    ProfileCommon p = GetProfile();
            txtFirstName.Text = p.first_name;
            txtLastName.Text = p.last_name;
            txtInitial.Text = p.initial;
            txtEmail.Text = p.email;

//this causes an null reference exception
bool? blnTest = p.sex;

Is this the correct way to set a default null value in webconfig?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苯莒 2024-11-01 23:27:12

这里的问题是配置文件属性的默认类型是 bool,它不是可为 null 的类型。它总是默认为 false。

您始终可以创建一个自定义类来封装性别,并使用它而不是 bool。这样,当没有设置值时,该类将尝试实例化并根据需要恢复为 null。

更改网络配置:

 <profile defaultProvider="MyProfileProvider" inherits="FTS.Membership.Profile.MyProfileProvider,FTS.Membership">
      <providers>
        <clear/>
        <add name="MyProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="FTS.Membership.Profile.MyProfileProvider,FTS.Membership"/>
      </providers>
      <properties>
        <add name="first_name" type="string" serializeAs="String" defaultValue=""/>
        <add name="last_name" type="string" serializeAs="String" defaultValue=""/>
        <add name="initial" type="string" serializeAs="String" defaultValue=""/>
        <add name="email" type="string" serializeAs="String"/>
        <add name="active" type="bool" serializeAs="String" defaultValue="false"/>
        <add name="creation_date" type="datetime" serializeAs="String"/>
        <add name="update_date" type="datetime" serializeAs="String"/>
        <add name="last_activity_date" type="datetime" serializeAs="String"/>
        <!--<add name="sex" type="bool" serializeAs="String" defaultValue="false"/>-->

      </properties>
    </profile>

和类:

using System;
using System.Web.Profile;
using System.Collections.Generic;

namespace FTS.Membership.Profile
{
    public class MyProfileProvider : ProfileBase
    {
        public bool? sex
        {
            get {
                if (base["sex"] == null)
                {
                    return null;
                }
                return (bool)base["sex"];
            }
            set { base["sex"] = value; }
        }
    }
}

The problem here is that the default type of a profile property is bool which is not a nullable type. It will always default to false.

You could always create a custom class to encapsulate Sex / Gender and use this instead of bool. That way when there is no value set the class will then attempt to instantiate and revert to null as required.

Changes to web config:

 <profile defaultProvider="MyProfileProvider" inherits="FTS.Membership.Profile.MyProfileProvider,FTS.Membership">
      <providers>
        <clear/>
        <add name="MyProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="FTS.Membership.Profile.MyProfileProvider,FTS.Membership"/>
      </providers>
      <properties>
        <add name="first_name" type="string" serializeAs="String" defaultValue=""/>
        <add name="last_name" type="string" serializeAs="String" defaultValue=""/>
        <add name="initial" type="string" serializeAs="String" defaultValue=""/>
        <add name="email" type="string" serializeAs="String"/>
        <add name="active" type="bool" serializeAs="String" defaultValue="false"/>
        <add name="creation_date" type="datetime" serializeAs="String"/>
        <add name="update_date" type="datetime" serializeAs="String"/>
        <add name="last_activity_date" type="datetime" serializeAs="String"/>
        <!--<add name="sex" type="bool" serializeAs="String" defaultValue="false"/>-->

      </properties>
    </profile>

and the class:

using System;
using System.Web.Profile;
using System.Collections.Generic;

namespace FTS.Membership.Profile
{
    public class MyProfileProvider : ProfileBase
    {
        public bool? sex
        {
            get {
                if (base["sex"] == null)
                {
                    return null;
                }
                return (bool)base["sex"];
            }
            set { base["sex"] = value; }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文