Asp.net 将可为null的int绑定到asp:TextBox

Asp.net 将可为null的int绑定到asp:TextBox,asp.net,data-binding,nullable,Asp.net,Data Binding,Nullable,我有一个属性int?MyProperty作为我的数据源(ObjectDataSource)中的成员。我可以把它绑定到文本框上吗 <asp:TextBox ID="MyTextBox" runat="server" Text='<%# Bind("MyProperty") %>' /> 基本上,我希望在文本框中获得一个显示为空的null值,一个数字作为数字。如果文本框为空,MyProperty应设置为null。如果文本框中有数字,则MyProperty应设置为该数字

我有一个属性
int?MyProperty
作为我的数据源(ObjectDataSource)中的成员。我可以把它绑定到文本框上吗

<asp:TextBox ID="MyTextBox" runat="server" Text='<%# Bind("MyProperty") %>' />

基本上,我希望在文本框中获得一个显示为空的
null
值,一个数字作为数字。如果文本框为空,
MyProperty
应设置为
null
。如果文本框中有数字,则MyProperty应设置为该数字

如果我尝试它,我会得到一个异常:“Blank不是有效的Int32”

但是我怎么能做到呢?如何使用可空属性和绑定

提前谢谢


<asp:TextBox ID="MyTextBox" runat="server" 

Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' />

您可以使用HasValue确定可为null的类型是否为null,然后设置Text属性。

我开始相信绑定可为null的值属性是不可能的。直到现在,我只能看到添加附加帮助器属性以绑定可为空类型的变通方法:

public int? MyProperty { get; set; }

public string MyBindableProperty
{
    get
    {
        if (MyProperty.HasValue)
            return string.Format("{0}", MyProperty);
        else
            return string.Empty;
    }

    set
    {
        if (string.IsNullOrEmpty(value))
            MyProperty = null;
        else
            MyProperty = int.Parse(value);
            // value should be validated before to be an int
    }
}
然后将helper属性绑定到文本框而不是原始文本框:

<asp:TextBox ID="MyTextBox" runat="server"
    Text='<%# Bind("MyBindableProperty") %>' />


我很乐意看到另一个解决方案。

我找到了一个解决方案,其中包括一个FormView,但是您没有指定它是否适合您的场景

无论如何,在我的例子中,数据绑定的实体是我自己的dto(这并不重要),诀窍是当您更新formview时,您必须基本上附加预数据绑定事件,并将空字符串作为空值重新写入,以便框架属性可以将值注入构造的对象:

protected void myFormView_Updating(object sender, FormViewUpdateEventArgs e)
{
     if (string.Empty.Equals(e.NewValues["MyProperty"]))
         e.NewValues["MyProperty"] = null;
}
同样地,插入

protected void myFormView_Inserting(object sender, FormViewInsertEventArgs e)
{
     if (string.Empty.Equals(e.Values["MyProperty"]))
         e.Values["MyProperty"] = null;
}

真正有趣的是,错误消息(不是有效的Int32)实际上是错误的,它应该写入(不是有效的可空值),但是可空值本来是头等公民,不是吗?

谢谢回复,enduro。但这根本不起作用,甚至无法编译。它将与Eval一起工作(至少在将Eval返回int之后?)但是绑定是另一回事。在
FormView
中,如果数据源是
EntityDataSource
,则绑定不起作用——我只得到
数据绑定:“System.Web.UI.WebControls.EntityDataSourceWrapper”不包含名为“MyBindableProperty”的属性。