【发布时间】:2015-08-10 01:01:36
【问题描述】:
当我遇到这个问题时,我正在使用 WebMethods。
我想使用 WebMethod 和 javascript 创建一个简单的计算器,但它只有在 DDL 的选项在浏览器的源代码中具有“selected”属性时才有效。如果我删除 UpdatePanel 这工作正常;页面被刷新,html 源代码将显示我在 DDL 中选择的任何内容的“选定”属性。使用 UpdatePanel,仅选择第一个选项(默认情况下)。问题是我不想刷新整个页面。
这是我的代码:
<input id="TextA" type="text" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList1" EventName="SelectedIndexChanged" />
</triggers>
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
onselectedindexchanged="DropDownList1_SelectedIndexChanged" AutoPostBack="True">
<asp:ListItem Value="+">+</asp:ListItem>
<asp:ListItem Value="-">-</asp:ListItem>
<asp:ListItem Value="/">/</asp:ListItem>
<asp:ListItem Value="*">*</asp:ListItem>
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
<input id="TextB" type="text" />
网络方法:
[WebMethod]
public string Add(double a, double b)
{
double Calc = a + b;
//string StringCalc = Calc.ToString();
string Complete = "The answer is " + Calc;
return Complete;
}
[WebMethod]
public string Subtract(double a, double b)
{
double Calc = a - b;
string Complete = "The answer is " + Calc;
return Complete;
}
[WebMethod]
public string Divide(double a, double b)
{
double Calc = a / b;
string Complete = "The answer is " + Calc;
return Complete;
}
[WebMethod]
public string Multiply(double a, double b)
{
double Calc = a * b;
string Complete = "The answer is " + Calc;
return Complete;
}
JS:
<script type="text/javascript">
function Add() {
var v1 = $get('TextA').value;
var v2 = $get('TextB').value;
CalculatorWebService.Add(v1, v2, ResultCallBack);
}
function Subtract() {
var v1 = $get('TextA').value;
var v2 = $get('TextB').value;
CalculatorWebService.Subtract(v1, v2, ResultCallBack);
}
function Divide() {
var v1 = $get('TextA').value;
var v2 = $get('TextB').value;
CalculatorWebService.Divide(v1, v2, ResultCallBack);
}
function Multiply() {
var v1 = $get('TextA').value;
var v2 = $get('TextB').value;
CalculatorWebService.Multiply(v1, v2, ResultCallBack);
}
var DropDownSelection = document.getElementById('DropDownList1');
switch (DropDownSelection.options[DropDownSelection.selectedIndex].value) {
case "+":
$addHandler($get('ButtonA'), 'click', Add);
break;
case "-":
$addHandler($get('ButtonA'), 'click', Subtract);
break;
case "/":
$addHandler($get('ButtonA'), 'click', Divide);
break;
case "*":
$addHandler($get('ButtonA'), 'click', Multiply);
break;
}
function ResultCallBack(result) {
$get('TextA').value = result;
}
</script>
总而言之,当我在 DDL 中选择一个选项时,如果我使用 UpdatePanel,则“selected”属性不会应用于任何选项(第一个默认选项除外),因此我的代码将无法工作。我是否误解了 UpdatePanel 的工作原理?
以下是我的页面源代码部分,您可以在其中看到尽管我选择了“/”,但它并没有被“选中”。
<div id="UpdatePanel1">
<select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
<option selected="selected" value="+">+</option>
<option value="-">-</option>
<option value="/">/</option>
<option value="*">*</option>
</select>
</div>
【问题讨论】:
-
我很好奇您为什么使用更新面板。看起来好像您正在通过 javascript 完成所有工作。服务器端会发生什么?
-
我也不确定你的 javascript 中的
switch语句。由于您不在循环或事件处理程序中,我怀疑这只会为在浏览器中加载页面时选择的任何项目设置处理程序。 -
@AnnL。我将 web 方法用于服务器端功能,在尝试使用 JavaScript 调用 Web 服务时,我无法让它与更新面板一起使用。它完美无缺,没有更新面板(包括交换机语句)......我正在使用updatePanel来防止完整页面刷新,但在选择不同的选项时似乎没有刷新DDL。当然我只是错过了什么?
-
更新面板的目的是允许您将信息发布回服务器并从服务器端更改屏幕外观,而无需进行整页刷新。不过,鉴于您的所有服务器功能都是通过 Web 方法实现的,我认为您甚至不需要回帖。这就是为什么我质疑是否需要更新面板。如果您不回帖,则不需要更新面板。
-
@AnnL。啊,这是有道理的,所以更新面板仅适用于服务端而不是客户端?那么有没有办法只刷新下拉列表来更新“选定”属性?还是我需要使用 htm 标准下拉控件而不是 aspx 下拉控件?顺便感谢您的回复,我最近一直在通过跟踪和错误学习分配!
标签: javascript asp.net drop-down-menu updatepanel asmx