代码之家  ›  专栏  ›  技术社区  ›  Slauma

将可为空的int绑定到asp:textbox

  •  5
  • Slauma  · 技术社区  · 14 年前

    我有财产 int? MyProperty 作为我的数据源(objectdatasource)中的成员。我能把这个绑定到一个文本框吗,比如

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

    基本上我想得到一个 null 值显示为空 "" 在文本框中,将数字作为数字。如果文本框为空 MyProperty 应设置为 无效的 .如果文本框中有数字,则MyProperty应设置为此数字。

    如果我尝试,我会得到一个异常:“blank不是有效的int32”。

    但我该怎么做呢?如何使用可为空的属性和绑定?

    提前谢谢!

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jaguar    12 年前

    好吧,我找到了一个解决方案,其中包括一个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)实际上是错误的,它应该写入(不是有效的可空值),但是可空值应该是一等公民,不是吗?

        2
  •  2
  •   Slauma    14 年前

    我开始相信不可能绑定可为空的值属性。直到现在,我只能看到添加附加的helper属性以绑定可为空类型的解决方法:

    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") %>' />
    

    我很高兴看到另一个解决办法。

        3
  •  1
  •   enduro    14 年前
    <asp:TextBox ID="MyTextBox" runat="server" 
    
    Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' />
    

    您可以使用hasvalue来确定可空类型是否为空,然后设置文本属性。