间歇性功能从SilverLight向MVC控制器发送数据

时间:2010-09-23 14:28:54

标签: c# asp.net-mvc silverlight

我有一个SilverLight按钮,从文本框中获取注释以保存在我的数据库中,然后关闭窗口。

Silverlight的:

Task task = new Task();
private void saveChangeBtn_Click(object sender, RoutedEventArgs e)
{
    string commentTxtBxValue = commentTxtBx.Text;
    task.SaveComment(commentTxtBx.Text);
    commentTxtBx.Text = commentTxtBxValue;

    HtmlPage.Window.Invoke("closeWindow", null);
}

SilverLight在我的SilverLight项目模型中调用SaveComment(),该模型创建一个URI,并使用此URI将注释文本发送到我的MVC控制器UploadStringAsync()

型号代码:

public void SaveComment(string Comment)    
{    
    // Create post string    
    StringBuilder postData = new StringBuilder();    
    postData.AppendFormat("?{0}={1}", "id", this.PageBreakId);    
    postData.AppendFormat("&{0}={1}", "comment", Comment);    


    string dataString = postData.ToString();    
    byte[] data = Encoding.UTF8.GetBytes(dataString);    

    // Configure client    
    WebClient client = new WebClient();    
    client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);    
    client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);    

    string baseUri = HtmlPage.Document.DocumentUri.ToString().ToLower();    
    baseUri = baseUri.Substring(0, baseUri.IndexOf("currentPage"));    

    Uri uri = new Uri(baseUri + "SaveComment", UriKind.Absolute);    

    try    
    {    
        // Start upload         
        client.UploadStringAsync(uri, dataString);    
    }    
    catch (Exception e)    
    {    
        System.Diagnostics.Debug.WriteLine(e.Message);    
    }    
}   

最后,我的MVC Controller将其保存到数据库中。

MVC控制器:

[AcceptVerbs(HttpVerbs.Post)]    
 public ActionResult SaveComment()    
 {    
    //Save to Database    
 }

我的问题是,看起来,我的SilverLight代码HtmlPage.Window.Invoke("closeWindow", null);会关闭页面并在有机会完成之前结束代码执行。如果我在我的MVC控制器上设置一个断点,它有时只会被触发。我注意到FireFox几乎总能击中它,但IE8几乎从未击中它。

在关闭页面之前,我该怎样做才能确保我的代码完成?

谢谢,

亚伦

2 个答案:

答案 0 :(得分:0)

您的`WebClient.UploadStringAsync'是一种并行方法。一旦你的代码到达那里,它就会转移到程序的其余部分,这就是为什么它可能会在它有机会执行其内部代码之前点击关闭窗口代码。

解决

  1. Task课程中,实施一个事件并在UploadStringCompleted回调中调用它。然后在主代码中触发此事件时进行侦听并触发关闭窗口代码。
  2. 另一种方法是在UploadStringCompleted课程中将关闭窗口代码放在Task(可能是错误的设计)中。

答案 1 :(得分:0)

你可能/可能没有足够的执行时间来完成上传(因为它的异步因此在执行到达UploadStringAsync后继续执行而不是等待并且例程退出)

msdn在WebClient.UploadStringAsync ..

上有这个说法
  

将指定的字符串上载到指定的资源。这些方法不会阻止调用线程

UploadStringAsync有一个事件可以确定上传完成的时间, 它的WebClient.UploadStringCompleted事件

msdn在WebClient.UploadStringCompleted事件

上有这个说法
  

异步字符串上载操作完成时发生。

您可以在其中关闭该页面。即在事件处理程序中调用以下内容。

HtmlPage.Window.Invoke("closeWindow", null);