我想在EditItemTemplate中绑定一个TextBox,但是我需要在显示之前将文本框的原始值传递给一个函数。我的目标是在显示之前格式化值。这是一个复杂的格式规则,所以我不能使用任何内置的格式化程序。使用Eval()时很容易,但是使用Bind()这是另一个故事。我知道可以使用代码隐藏中的事件来完成,但我试图从aspx页面完成所有操作。
示例:
<EditItemTemplate>
<asp:TextBox ID="NameTextBox" Text=<%# Bind("Name") %> MaxLength="255" runat="server" />
</EditItemTemplate>
...谢谢
答案 0 :(得分:4)
您无法通过标记执行此操作。 ASP.NET有一个特殊情况代码来解析Bind
语法并为其生成特殊代码。这就是为什么双向数据绑定不支持Bind()
以外的任何内容。您可以在Eilon Lipton撰写的How ASP.NET databinding deals with Eval() and Bind() statements文章中找到更多相关信息:
令许多读者惊讶的是,ASP.NET中没有绑定方法! 当ASP.NET解析您的文件并看到您正在使用数据绑定时 表达式(以角括号 - 百分比 - 磅格式,
"<%# %>"
) 有特殊情况代码来解析Bind
语法并生成一些 它的特殊代码。当你使用<%# Bind("Name") %>
时,它不是真实的 功能调用。如果ASP.NET解析代码并检测到Bind()
声明,它将声明分为两部分。第一部分是 单向数据绑定部分,最终只是一个常规的Eval()
致电。第二部分是反向部分,即 通常是"string name = TextBox1.Text"
行的一些代码 从它被束缚的地方夺回价值。非Bind()数据绑定语句是文字代码(我们使用
CodeSnippetExpressions
中的CodeDom
,语言中的任意代码 您的选择是允许的。但是,因为ASP.NET必须解析Bind()
语句,双向数据绑定不支持其他任何内容 比Bind()
。例如,以下语法无效,因为它 尝试调用任意代码并同时使用Bind()
:<%# FormatNameHelper(Bind("Name")) %>
双向数据绑定支持的唯一格式为Bind("field")
和Bind("field", "format string {0}")
。
因此,请考虑在代码隐藏中执行此操作,或使用Eval
方法。
答案 1 :(得分:3)
这样的事情应该与你正在寻找的东西非常接近:
<asp:TextBox Id="TextBox1" runat="server" Text='<%# FormatValue(Eval("Name"), Container.DisplayItemIndex) %>' />
在代码隐藏中:
public object FormatValue(object value, int itemIndex)
{
var input = GridView1.Rows[itemIndex].FindControl("TextBox1") as TextBox;
if (input != null)
{
//do whatever you need with the old value
var oldValue = input.Text.Trim();
}
//format the value and send it back
return string.Format("My name is {0}", value);
}