【问题标题】:How to feed client-side AJAX script with an ASP.NET server side *DYNAMIC* .json and .xml file?如何使用 ASP.NET 服务器端 *DYNAMIC* .json 和 .xml 文件提供客户端 AJAX 脚本?
【发布时间】:2012-05-17 05:11:18
【问题描述】:

到目前为止,我了解到,客户端 AJAX 脚本可以从服务器读取 static .json 或 .xml 文件,例如http://www.mydomain.com/all_cities.xml.

但我需要根据客户端的用户输入动态生成.json或.xml文件。例如假设用户从 DropDownList1 中选择了一个州,AJAX 应该用该州的城市填充 DropDownList2;而我不喜欢发送所有城市,然后在客户端过滤所需的城市!

所以,我想知道 ASP.NET 如何处理这个问题,例如当它看到“http://www.mydomain.com/cities.json?state=9”时,它应该使用动态创建的名为ities.json 的json 文件进行响应,其中包含处于状态#9 的城市?

提前致谢!

【问题讨论】:

  • 您使用的是 ASP.NET WebForms 还是 MVC?
  • 我正在使用 ASP.NET WebForms。为什么会有所不同?!
  • 嗯,我的回答会有所不同......因为有很多方法可以实现这一点,我只是想让范围有点窄......
  • 您使用的是 AjaxToolKit 更新面板还是 jQuery?
  • 不是 AjaxToolKit 也不是 jQuery。我正在使用 JavaScript 和 XMLHttpRequest activex!我更喜欢从头开始做事,以便更好地控制它们;)

标签: asp.net xml ajax json dynamic


【解决方案1】:

如果你想创建 WCF 服务,你可以有一个 WebGet 接受状态作为参数并返回该州的城市:

[WebGet(UriTemplate = "cities/{state}")]
public List<string> GetCities(string state)
{
    List<string> citiesFromState;
    // Build up a List of cities based on the state sent
    return citiesFromState;
}

在您的应用程序的 web.config 中,将 automaticFormatSelectionEnabled 设置为 true,以便 WCF 将查看 HTTP 请求的“接受”标头以确定发送响应的格式(例如 xml 或 json):

<behavior name="webHttpBehavior">
    <webHttp automaticFormatSelectionEnabled="true" helpEnabled="true"/>
</behavior>

这允许 WCF 为您处理序列化。否则,您可以在WebGet 中手动进行序列化。

【讨论】:

  • 有没有更简单的方法可以避免 WCF?我不喜欢接触 WCF 复杂的员工
【解决方案2】:

有很多方法可以做到这一点 - 基本上,最简单的方法是让任何标准网页(无论是表单、MVC 控制器/动作/等等...)都可以像任何普通网页一样使用用户输入但不是返回 html,而是返回 XML。 (通过返回 XML,我的意思是使页面的内容完全是 XML 并添加适当的标题)

您的问题过于宽泛,无法提供更多细节 - 但简单地说,它很容易完成,客户端(在本例中为 JavaScript)通常无法区分。

【讨论】:

  • 你的意思是写例如按 HTTP 标头和内容类型的 XML 下载代码?
  • 我的意思是有 some 形式的服务器代码,它返回动态 XML,然后从 JS 调用它 - 如果你使用表单,你会有一个页面由您的 JS 调用。在后面的代码中,有准备您的 XML 并返回(可能通过response.write())给用户的代码。简而言之,只需返回有效的 xml 和 text/xml 的内容类型
  • 看看这里4guysfromrolla.com/articles/092403-1.aspx 了解我的意思的一个例子。如果您更喜欢 VB,这里有一个转换器:developerfusion.com/tools/convert/csharp-to-vb
  • 谢谢你! 4guysfromrolla.com/articles/092403-1.aspx 的“将 XML 内容直接发送到浏览器窗口”部分正是我想要的!再次感谢@Basic
【解决方案3】:

实现这一点的方法之一是

在客户端:使用 jQuery 并调用方法/服务以返回 JSON。像

function CallService() {
    $.ajax({
        type: "GET", //HTTP verb
        url: serviceUrl,
        data: "{}", //Data sent to server
        contentType: "application/json; charset=utf-8", // content type sent to server
        dataType: "json", //Expected data format from server e.g. json, xml etc.
        success: OnSuccess
    });
}

function OnSuccess(data) {
    var options = $(".InputDropDown"); //.InputDropDown is class assigned to dropdown
    //don't forget error handling! 
    $.each(data, function (index) {
        var item = data[index];
        options.append($("<option />").val(item.Id).text(item.Name));
    });
}

此方法将在第一次下拉更改时调用

在服务器端:使用返回 JSON 的 Web 服务(或 WCF)方法或页面方法(在您的 Web 应用程序中)。

    [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "Countries")]
    List<Country> GetCountries();

如果您不熟悉 jQuery 等。我强烈建议您阅读此内容。

可以在LINK-1LINK-2 找到使用 PageMethod 和纯 JavaScript 的替代方法(无 WCF) 示例

【讨论】:

    【解决方案4】:

    如果您想读取静态内容,默认情况下您只能使用 .XML,因为 .JSON 不是 IIS 支持的默认 MIME-TYPE。这是一个关于如何使用 jQuery 的 ajax() 方法将静态 XML 文件读入页面的示例。

    静态文件“cities.xml”。

    <?xml version="1.0" encoding="utf-8" ?>
    <cities>
        <city>City A</city>
        <city>City B</city>
        <city>City C</city>
    </cities>
    

    用于读取静态 XML 并解析为 JavaScript 数组的 jQuery 代码。

    $.ajax({
        url: 'cities.xml',
        dataType: 'xml',
        success: function (xml)
        {
            var cities = [];
    
            $(xml).find('city').each(function ()
            {
                cities[cities.length] = $(this).text();
            });
    
            // Do something with your array of values here.
        }
    });
    

    【讨论】:

    • 正如我所引用的,我想在服务器端即时生成 city.xml,然后在状态代码请求此 xml 文件作为参数时将其提供给客户端的 AJAX XMLHttpRequest。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多