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

asp.net – 当DataBind为Nullable DateTimeOffset和field为NULL

发布时间:2020-12-16 09:38:55 所属栏目:asp.Net 来源:网络整理
导读:我创建了一个简单的CompositeControl并公开了一个Nullable DateTimeOffset属性. 我正在使用控件将控件绑定到SQL Server DateTimeOffset字段 DateTimeOffset='%# Bind("myDateTimeOffsetField") %' 当DateTimeOffset字段具有值时,这很有用. 但是当该字段为NUL
我创建了一个简单的CompositeControl并公开了一个Nullable DateTimeOffset属性.
我正在使用控件将控件绑定到SQL Server DateTimeOffset字段

DateTimeOffset='<%# Bind("myDateTimeOffsetField") %>'

当DateTimeOffset字段具有值时,这很有用.
但是当该字段为NULL时,我得到“指定的转换无效”错误.

当字段为NULL时,如何停止此错误并将我的属性设置为Nothing?

我以为这将是默认行为!

属性定义是:

Public Property DateTimeOffset As DateTimeOffset?

后来评论:

我发现如果我从使用Bind更改为:

DateTimeOffset='<%# iif(IsDbNull(Eval("myDateTimeOffsetField")),Nothing,Eval("myDateTimeOffsetField")) %>'

但是我没有将“myDateTimeOffsetField”作为参数传递给FormView.ItemUpdating事件(是的,这是在FormView控件中),因为ASP.NET假定我没有绑定回数据库.

实际代码(按要求添加)

这是我试图绑定到的复合控件中的属性:

Public Property DateTimeOffset As DateTimeOffset?
Get
    Return CType(ViewState("DTO"),DateTimeOffset?)
End Get
Set(value As DateTimeOffset?)
    ViewState("DTO") = value
End Set
End Property

下面是Binding的标记. Control位于FormView的EditItemTemplate中,该FormView绑定到SQL DataSource,返回名为[dtoMldRejOn]的字段,并带有可选的DateTimeOffset值.

<APS:DateTimeOffsetControl runat="server" id="dtocMldRejOn" TextBoxCssClass="inputdatetime" ValidationGroup="vw1" FieldName="<%$Resources: Resource,rxgFrom %>" DateTimeOffset='<%# Bind("dtoMldRejOn") %>' WindowsTimeZoneID="<%# me.WindowsTimeZoneID %>" IsRequired="false" />

如您所见,我的Composite控件用于处理DateTimeOffset值.除非数据库中的DateTimeOffset字段[dtoMldRejOn]为NULL,否则一切正常,然后我得到异常.

解决方法

我之前从未创建过可绑定控件,但我想提出建议.如何将DateTimeOffset属性设置为Object类型.这样,该属性将接受任何数据类型,包括DBNull.

一旦进入Set代码,检查传递的值是否为DBNull.Value.如果是这样,创建一个新的空DataTimeOffset?对象并将其保存在ViewState中.

如果为非DBNull值,则抛出错误,如果无法将其转换为datetime.

我没有试过这个,所以我不知道这是否有效.

################更新答案################

我的建议是,你创建了2个属性如下:

Public Property DateTimeOffset() As DateTimeOffset?
    Get
        Return DirectCast(ViewState("DTO"),DateTimeOffset?)
    End Get
    Set(ByVal Value As DateTimeOffset?)
        ViewState("DTO") = Value
    End Set
End Property

<Bindable(True,BindingDirection.TwoWay)>
Public Property DbDateTimeOffset As Object
    Get
        Return Me.DateTimeOffset
    End Get
    Set(value As Object)
        If IsDBNull(value) OrElse value Is Nothing Then
            Me.DateTimeOffset = New DateTimeOffset?
        Else
            Me.DateTimeOffset = DirectCast(value,DateTimeOffset?)
        End If
    End Set
End Property

所以在你的标记中,绑定将是DbDateTimeOffset属性:

DbDateTimeOffset='<%# Bind("myDateTimeOffsetField") %>'

在代码后面,您可以使用其他属性来读取属性而无需强制转换.

(编辑:李大同)

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

    推荐文章
      热点阅读