将nullable int绑定到asp:TextBox

时间:2010-03-25 22:35:09

标签: asp.net data-binding nullable

我有一个属性int? MyProperty作为我的数据源(ObjectDataSource)中的成员。我可以将它绑定到TextBox,例如

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

基本上我想在TextBox中将null值显示为空白"",将数字显示为数字。如果TextBox为空,则MyProperty应设置为null。如果TextBox中包含数字,则应将MyProperty设置为此数字。

如果我尝试它,我会得到一个例外:“空白不是有效的Int32”。

但我怎么能这样做?如何使用可空属性和Bind?

提前致谢!

3 个答案:

答案 0 :(得分:4)

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

无论如何,在我的情况下,DataBound-ed实体是我自己的dto(不是它应该重要),并且诀窍是当你更新formview时你必须基本上附加在pre-dataant事件上并重新将空字符串写为空值,以便框架可以将属性值注入构造对象:

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)实际上是错误的,它应该写(不是一个有效的Nullable),但那么nullables将是第一个班级公民不会吗?

答案 1 :(得分:2)

我开始相信绑定可空值属性是不可能的。现在我只能看到解决方法,添加一个额外的帮助器属性来绑定一个可以为空的类型:

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属性绑定到TextBox而不是原始的:

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

我很高兴看到另一种解决方案。

答案 2 :(得分:1)

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

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

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