ASP.NET 2.0,PageMethods。
美好的一天,
我正在使用ASP.NET AJAX PageMethods在我的页面上更改下拉列表时动态更改Label的文本。
我知道在客户端更改标签时,不会在回发之间保留标签文本,这就是我的情况。我听说解决方案是将标签内容保存在隐藏字段中,然后在Page_Load中设置该字段的标签文本。
然而,这个解决方案对我来说似乎并不干净。还有其他替代方案或最佳做法吗?
谢谢!
为了澄清,我有一个带有人名的下拉列表。当下拉列表发生变化时,我希望在标签中放置该人的电话。但是,我认为做一个完整的回发并不是最好的选择,所以我决定用一个PageMethod来获取电话,传递下拉列表中所选项目的ID来检索电话,然后把它放在标签中。
但是,由于其他控件会导致完整的回发,因此每次回发都会丢失电话。我知道将它放在一个隐藏的字段中,然后在有完整的回发时将其设置回Page_Load中的标签会起作用,但我担心是否有另一个解决方案。由于WebMethods被标记为静态,我无法写出Label.text = person.Telephone;在他们中间。
答案 0 :(得分:5)
由于您似乎有ajax,您可以只进行部分回发,将数字写入标签并进入视图状态,并在page_load中将值从viewstate写入标签。
在DropDownList事件处理程序中:
string phone = <.. get phone number ...>;
myLabel.Text = phone;
ViewState["currentPhone"] = phone;
在PageLoad上:
myLabel.Text = (ViewState["currentPhone"] != null) ? (string)ViewState["currentPhone"] : string.Empty;
如果您不想使用Ajax,可以在aspx文件中定义HiddenInputField,使用javascript填充内容,并在Postback上填充带有内容的标签。 在aspx上:
<asp:HiddenInputField runat="server" ID="myHiddenInput" />
在PageLoad上:
myLabel.Text = myHiddenInput.Value;
答案 1 :(得分:1)
我建议坚持使用隐藏的字段解决方案,这样您就可以将逻辑保存在一个地方。
另一种方法是使用更新面板而不是页面方法,但我不这样做,因为这对性能不利。
正如其他人所说,第三种选择是在服务器端运行相同的逻辑,只要下拉的选定值发生变化。唯一的重复就是调用您已有的相应代码。
答案 2 :(得分:0)
如果标签值由下拉列表的值确定,则可以始终在服务器上复制该逻辑。
如果这个逻辑过于复杂,或者你不想将它维持多个位置,那么下一个最佳选择就是你的建议。我不确定为什么你认为这不是一个干净的解决方案,这是从客户端获取信息到服务器的好方法。
答案 3 :(得分:0)
您是否考虑过将代码放在Page_Load中以确保标签根据下拉列表值反映所需的值?这样每次回发你至少可以确保获得正确的价值而且你不必担心将它存储在2个地方。