有没有办法从页面方法更新实例变量而不使它们变为静态?
我的页面有一个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>
答案 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等代码更新会话状态。如果您不能或不想使用会话状态,还有其他可能性。