Прерывистая функциональность Отправка данных из SilverLight в контроллер MVC - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть кнопка 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 вызывает SaveComment() в модели моего проекта SilverLight, которая создает 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-контроллер сохраняет его в базе данных.

MVC-контроллер:

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

Моя проблема в том, что, похоже, мой код SilverLight HtmlPage.Window.Invoke("closeWindow", null); закрывает страницу и завершает выполнение кодапрежде чем у него есть шанс закончить.Если я установлю точку останова на своем контроллере MVC, она будет срабатывать только иногда.Я заметил, что FireFox почти всегда попадает в него, но IE8 почти никогда не попадает в него.

Что я могу сделать, чтобы мой код завершил работу до закрытия страницы?

Спасибо,

Аарон

Ответы [ 2 ]

0 голосов
/ 23 сентября 2010

Как и у вас может / не может быть достаточно времени выполнения для завершения загрузки (потому что его асинхронное выполнение продолжается, поэтому после того, как выполнение достигает UploadStringAsync вместо ожидания и завершения процедуры)

msdn имеет это сказать на WebClient.UploadStringAsync ..

Загружает указанную строку в указанный ресурс.Эти методы не блокируют вызывающий поток .

. Для UploadStringAsync существует событие, определяющее, когда загрузка завершена, его событие WebClient.UploadStringCompleted

msdn имеет это сказать о событии WebClient.UploadStringCompleted

Происходит, когда завершается асинхронная операция загрузки строк.

, в которой вы можете закрыть страницу.т.е. вызовите следующее в вашем обработчике событий.

HtmlPage.Window.Invoke("closeWindow", null);
0 голосов
/ 23 сентября 2010

Ваш `WebClient.UploadStringAsync 'является параллельным методом. Как только ваш код попадает туда, он переходит к остальной части программы, поэтому он может попасть в код закрытия окна, прежде чем получит возможность выполнить свой внутренний код.

Разрешение

  1. В вашем Task классе реализуйте событие и вызывайте его внутри вашего UploadStringCompleted обратного вызова. Затем прослушайте, когда это событие запускается внутри вашего основного кода, и запустите код закрытия окна.
  2. Еще один способ сделать это - просто поместить код закрытия окна внутри вашего UploadStringCompleted (может быть, плохой дизайн) в классе Task.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...