如何在绑定TextBox时调用方法

时间:2012-04-09 20:45:40

标签: asp.net

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

示例:

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

...谢谢

2 个答案:

答案 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);
}