如何使用ajax和pagemethods更新页面变量?

时间:2012-01-03 04:54:04

标签: c# asp.net ajax webforms pagemethods

有没有办法从页面方法更新实例变量而不使它们变为静态?

我的页面有一个ViewModel对象,其中包含我想要更新ajax和pagemethods的大量数据。我使用asp.net前端页面中的ViewModel打印出变量值。

ViewModel类

  // ViewModel class
   public class ItemViewModel
   {
      public List<Item> Items = new List<Item>();
   }   

** ASP.net webforms页面(后端)**

   public ItemViewModel ViewModel;

    protected void Page_Load(object sender, EventArgs e)
    {
        // init ViewModel;
    }



     [WebMethod]
        public static bool GetItems(string userId)
        {
            // lots of code...
            ItemService i = new ItemService();

            ViewModel = i.GetItems(userId);  // How to update page variables or pass in a new one?

            return true;
        }

前端

                 <ul>
                        <% foreach (Item i in ViewModel.Items)
                           {  %>        
                                <li>
                                   <%=i.ItemName %>
                                </li>
                        <% } %>
                    </ul> 

3 个答案:

答案 0 :(得分:1)

如您所知,PageMethods是静态的。如果没有要使用的实例,静态方法就无法操作实例成员。

此外,您必须了解请求完成后您的页面实例不存在。 没有要操作的实例成员。

答案 1 :(得分:1)

使用会话状态是可能的,因为它在多个页面上传输,但您必须确保当用户在任何给定时间切换页面时,会话数据被清除,因为否则它将在下一页面加载时使用(除非那是你想要的)。

你也可以让你的方法构建一个粘贴到你页面的htmlstring:

public string myFunc()
{
     string html = "<li>foo</li";
     html += "<li>foo2</li>";

     return html;
}

然后在你的ajax success回调中你可以做到:

success: function(data) {
       $("#myUL").html(data);
});

它可以工作,但它确实需要您手动构建一个html字符串,如果您必须处理的不仅仅是一维数组,那么它会变得更加指数。

我建议将JSON与Ajax结合使用。这是传递你想要的任何东西的简单方法,并且仍然能够处理数据而不是将其粘贴为html。

http://www.learn-ajax-tutorial.com/Json.cfm

我建议您阅读本教程,它可以让您对如何构建和处理JSON有所了解。

答案 2 :(得分:0)

如果您需要将状态信息从一个请求转发到另一个请求,则不能使用Page实例变量(页面实例仅在单个请求的持续时间内存在) - 并且您不应该使用静态,要么。

一种正确的方法是让您的Ajax等代码更新会话状态。如果您不能或不想使用会话状态,还有其他可能性。