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”的属性。