从ASP.NET中的静态类更新控件的值

时间:2012-01-07 22:06:51

标签: c# asp.net

假设我有一个带有Label控件的ASP.NET页面和以下执行预定作业的静态类:

public static class Job
{
    // The Execute method is called by a scheduler and must therefore 
    // have this exact signature (i.e. it cannot take any paramters).
    public static string Execute()
    {
        // Do work
    }
}

当作业完成时,execute方法应该更新页面上Label控件的值。

我做了一些研究,唯一的方法似乎是使用HttpContext.Current.CurrentHandler。但是,这对我来说是不可取的,因为它可能会返回null。

由于Execute方法不能接受任何参数(请参阅注释),因此不能将Page实例作为参数传递。

还有其他方法可以从静态类更新控件吗?

注意:Execute方法必须是静态的,因为我正在创建一个EPiServer预定作业,这需要一个静态Execute方法(不带任何参数)。

3 个答案:

答案 0 :(得分:1)

如果作业没有同步执行(或者即使是),我认为您可能需要考虑控制顺序。

我在这种情况下建议的结构类似于以下结构:

1)网页发出作业请求

2)在某处,创建并存储对作业的唯一引用(例如GUID或数据库表中的标识列)

3)通过代码隐藏异步执行作业,然后将唯一标识符返回到网页。

4)网页在启动时启动一个javascript方法(例如,使用window.timeout),定期向Web服务器发出ajax查询以检查作业的状态。

5)作业完成后,它会使用适当的信息更新全局参考。

6)当javascript看到作业完成时,它会更新标签。

此过程允许用户在必要时继续进行其他工作,而不必担心由于回传时间过长而导致的超时等。

对于您的特定方案,您可以向Job类添加GUID属性(将传递回客户端)。

当Execute完成后,您可以将此GUID添加到ajax请求将检查的静态集合(即Dictionary<Guid, string>)(字符串值可以存储状态或完成信息)。

当ajax请求触发时,它将检查此静态集合,并在找到其作业时将其删除并将值返回给调用者。

答案 1 :(得分:0)

尝试使用全局变量(静态)或从Execute()方法中引发事件。

答案 2 :(得分:0)

您可以创建一个由Execute方法更新的静态属性,并将Label的Text属性绑定到aspx的OnInit方法中的static属性,Label.Text = Job.StaticProperty,如果需要有些动态响应你可以使用Ajax Timer Control来调用aspx页面上的方法,从aspx页面返回相同的静态值。

public static class Job 
{ 
    public static string UpdatedValue { get; private set; } // Or whatever the property is you wish to expose.

    // The Execute method is called by a scheduler and must therefore  
    // have this exact signature (i.e. it cannot take any paramters). 
    public static string Execute() 
    { 
        // Do work
        Job.UpdatedValue = "Execute Completed";
    } 
} 


protected override OnInit(EventArgs e)
{
    base.OnInit(e);
    this.TextLabel.Text = Job.UpdatedValue;
}


// Using MSDN basic sample
protected void Timer1_Tick(object sender, EventArgs e)
{
    this.TextLabel.Text = Job.UpdatedValue;
}