【问题标题】:How to call C# server side function from Javascript in ASP.net如何在 ASP.net 中从 Javascript 调用 C# 服务器端函数
【发布时间】:2015-04-28 12:59:51
【问题描述】:

我在服务器端有一个函数填充dropdownlist。我在 Javascript 中使用PageMethods 在客户端单击按钮调用此函数,如下所示:

<asp:ScriptManager ID="smMain" runat="server" EnablePageMethods="true" />
<asp:Button runat="server" ID="SearchButton" Text="Search" OnClientClick="SearchButtonClick();return false;"/>
<asp:DropDownList runat="server" ID="SearchCityDropDownList" Width="100px"/>

function SearchButtonClick() {
        PageMethods.SearchSearchButtonActivity(onSucess, onError);
    }
    function onSucess(result) {
        alert(result);
    }
    function onError(result) {
        alert('Cannot process your request at the moment, please try later.');
    }

服务器端功能:

[WebMethod]
public static string SearchButtonActivity()
{
    string result = "Everything is OK!";
    foreach (string value in getCityList())
    {
        SearchCityDropDownList.Items.Add(new ListItem(value));
    }
    return result;
}

当我运行此代码并单击按钮时,它只显示"Everything is OK!" 警报和

下拉列表仍然是空的。

请帮我解决这个问题,我认为这是一个回发问题,因为当我调试代码时,dropdownlist 的项目已满,但​​它们没有出现在下拉列表中.

谢谢

【问题讨论】:

  • 所以你得到“一切正常!”作为响应,但下拉列表仍然为空,是吗?
  • 你在哪里binddropdownlist??
  • 我没有绑定@nadeem,但是当您填写下拉列表的项目时,您可以在网页视图中看到这些项目!
  • 我已经有一段时间没有尝试过了,但我认为如果没有 UpdatePanel 或其他形式的 ajaxified 控件,您将无法做到这一点。下拉元素列表存储在视图状态中,我认为在回发之前不会发生变化。虽然已经有一段时间了,所以还是加点盐吧。
  • 您混淆了一个事实,即 Web 方法知道任何关于呈现服务器控件的更改 - 它不知道。这只是 AJAX,上面撒了一些 .NET 糖以使其工作。您应该从此方法返回getCityList() 的结果。然后客户端代码负责将项目添加到呈现的 HTML 控件(而不是 服务器控件)。

标签: javascript c# asp.net .net pagemethods


【解决方案1】:

这不起作用,你是如何设置的。你可以做一个更新面板,但这将是矫枉过正,IMO。问题是您正在进行一个 AJAX 调用,它只是返回到服务器并返回到客户端。页面和控件永远不会返回到服务器进行重新渲染。

相反,您需要将 onsuccess 回调的结果绑定到下拉列表。所以你的网络方法需要改变:

[WebMethod]
public static string SearchButtonActivity()
{
    var result = new List<string>();
    foreach (string value in getCityList())
    {
        result.Add(value);
    }
    return result;
}

然后你的 onSuccess 客户端回调需要处理它:

function SearchButtonClick() {
        PageMethods.SearchSearchButtonActivity(onSucess, onError);
    }
    function onSucess(result) {
        SearchCityDropDownList.options.length = 0;
        for (var i==0;i<result.length;i++) {
         AddOption(result[i], i);
        }
    }
    function onError(result) {
        alert('Cannot process your request at the moment, please try later.');
    }

function AddOption(text, value) {
    var option = document.createElement('option');
    option.value = value;
    option.innerHTML = text;
    SearchCityDropDownList.options.add(option);
}

您可以通过这种方式在服务器端检索选定的值:

string selectedVal = Request[SearchCityDropDownList.UniqueID]

感谢这个帖子的指导:Getting the value of a DropDownList after client side javascript modification

【讨论】:

  • 我最大的问题是我想在服务器端函数中处理它:(
  • 任何回发的结果都能看到列表中的这些动态条目吗?据我回忆,如果它们不在视图状态中,那么稍后您将无法在服务器端对它们进行任何操作。当然,如果页面不回发数据,这不是问题。
  • 我已更正,您可以在服务器上获取值,我更新了答案。
  • @JasonWilczak 这只是用于填充下拉列表,当我单击按钮时禁用标签如何?
  • 那将是另一个问题,但您可以在 onSuccess 回调中执行此操作。类似于:myLabel.disabled = true;
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2011-12-09
  • 2011-03-13
  • 1970-01-01
相关资源
最近更新 更多