通过静态方法访问页面对象

3

我正在使用asp.net日期选择器。然后通过jquery执行静态事件,当用户点击日期时,如下所示:

 <script>
    $(document).ready(function () {
        $("#datepicker").datepicker({
            onSelect: function (dateText, inst) {
                $("#<%= lblDate.ClientID %>").text("Are available on " + $('#datepicker').datepicker({ dateFormat: 'dd-mm-yy' }).val());

                $.ajax({
                    type: "POST",
                    url: "Schedule.aspx/DisplayAvail",
                    data: "{}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        // Do something interesting here.
                    }
                });
            }
        });
    });
</script>

代码后端:

[WebMethod] 
    public static void DisplayAvail()
    {
         //Grab data from db to check avail from this date
    }

这个方法可以正常工作。但是,从这个静态方法中无法访问页面级别的对象。我该如何将数据从这个方法发送到页面?


你需要使用 JSON。看看 Json.Net。 - tranceporter
1
tranceporter有“通过AJAX从数据库获取内容并显示”的代码,但这是关于ASP.NET的一个关键点:在页面加载和回发之间,_没有页面对象_。 - Rawling
3个回答

1

请看这里。您可以通过NuGet获取此内容。

http://james.newtonking.com/projects/json-net.aspx

一旦您将NewtonSoft Json dll添加为包含WebMethod的项目的引用,您就可以使用JSONConvert将可用日期序列化并将其发送到客户端。

public IEnumerable<string> AvailableData {get; set;}

[WebMethod] 
    public static void DisplayAvail()
    {
        this.AvailableData = GetRequiredData();
        this.AvailableData = JSONConvert.SerializeObject(this.AvailableData);
    }

而在客户端,您可以执行以下操作:

$(document).ready(function () {
        $("#datepicker").datepicker({
            onSelect: function (dateText, inst) {
                $("#<%= lblDate.ClientID %>").text("Are available on " + $('#datepicker').datepicker({ dateFormat: 'dd-mm-yy' }).val());
            $.ajax({
                type: "POST",
                url: "Schedule.aspx/DisplayAvail",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                        var arr = <%= this.AvailableData %>;
                       $.each(arr, function(index, value) {
                            // Do something with the data
                       });

                    });
                }
            });
        }
    });
});

谢谢,但我不想安装第三方的dll。希望只使用现有的框架来解决这个问题。我很惊讶除了NewtonSoft的Json dll之外没有其他东西。 - Argyle Ghost
如果您不想使用JSON,则需要将GetRequiredData的结果转换为字符串,将其分配给AvailableData,并在客户端使用jQuery进行解析/拆分/处理。问题是您希望在客户端共享一个数组。如果它是一个字符串,那么将其分配给AvailableData并在客户端使用它就很简单了。 - tranceporter

0

我决定使用JQuery的load()函数将外部页面加载到当前页面中,代码如下:

...Jquery

$("#GetData").load("getData.aspx?GetDate=012420012");

...html

<div id="GetData">
...
</div>

感谢您的所有反馈,但我认为这是最好的选择。干杯!:)


更具体地说,(对于那些可能在以后找到此页面的人),我使用了JQuery从页面对象中获取日期:$("#GetData").load("getData.aspx?Date=" + $("#myDate"));您也不必加载所有HTML标记,如body和form等,因为JQuery只是将HTML标记插入到您指定的位置。 - Argyle Ghost

-1
你可以尝试使用PageMethods():
这是一个简单的教程 Simple PageMethods example. 同时你还需要做这个:
 <asp:ScriptManager ID="ScriptManager" runat="server" EnablePageMethods="true" />

;)


该方法将实例方法转换为静态方法。我的问题是,当 jQuery 执行时,您必须执行一个没有访问实例方法和页面对象的静态方法。嗯...... - Argyle Ghost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接