4

我想在 EditItemTemplate 中绑定()一个 TextBox,但我需要在显示之前将文本框的原始值传递给一个函数。我的目标是在显示值之前对其进行格式化。这是一个复杂的格式化规则,所以我不能使用任何内置的格式化程序。使用 Eval() 很容易做到,但使用 Bind() 就另当别论了。我知道它可以使用代码隐藏中的事件来完成,但我试图从 aspx 页面完成这一切。

例子:

<EditItemTemplate>
        <asp:TextBox ID="NameTextBox" Text=<%# Bind("Name") %> MaxLength="255" runat="server" />
</EditItemTemplate>

谢谢...

4

2 回答 2

4

您不能从标记中执行此操作。ASP.NET 有一个特殊代码来解析Bind语法并为其生成特殊代码。这就是为什么双向数据绑定不支持除Bind(). 您可以在Eilon Lipton的ASP.NET 数据绑定如何处理 Eval() 和 Bind() 语句一文中找到更多信息:

令许多读者惊讶的是,ASP.NET 中没有绑定方法!当 ASP.NET 解析您的文件并看到您正在使用数据绑定表达式(在尖括号百分比格式中"<%# %>")时,它具有特殊情况代码来解析Bind语法并为其生成一些特殊代码。当您使用<%# Bind("Name") %>它时,它不是真正的函数调用。如果 ASP.NET 解析代码并检测到Bind() 语句,它会将语句分成两部分。第一部分是单向数据绑定部分,最终只是一个常规 Eval()调用。第二部分是反向部分,它通常是一些代码,"string name = TextBox1.Text" 可以从绑定的位置获取值。

Non-Bind() 数据绑定语句是文字代码(我们 CodeSnippetExpressions在 中使用CodeDom),因此允许使用您选择的语言的任意代码。但是,因为 ASP.NET 必须解析 Bind()语句,所以双向数据绑定不支持除Bind(). 例如,以下语法是无效的,因为它试图调用任意代码并同时使用Bind()<%# FormatNameHelper(Bind("Name")) %>双向数据绑定中支持的唯一格式是Bind("field")Bind("field", "format string {0}")

因此,请考虑在代码隐藏中执行此操作,或者改用Eval方法。

于 2012-04-09T21:48:37.170 回答
2

像这样的东西应该非常接近你正在寻找的东西:

<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);
}
于 2012-04-09T20:51:09.713 回答