Обратная передача в загруженном ASP.NET UserControl с помощью jQuery - PullRequest
1 голос
/ 02 апреля 2011

Я использую этот WebService и Class для рендеринга UserControl и динамически загружаю его с помощью jQuery:

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.HtmlControls;

namespace TestJQueryAjax
{
    public class KeyVal
    {
        public string Key { set; get; }
        public object Value { set; get; }
    }

    /// <summary>
    /// Summary description for Ajax
    /// </summary>
    [ScriptService]
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Ajax : WebService
    {
        /// <summary>
        /// Removes Form tags using Regular Expression
        /// </summary>
        private static string cleanHtml(string html)
        {
            return Regex.Replace(html, @"<[/]?(form)[^>]*?>", string.Empty, RegexOptions.IgnoreCase);
        }
        [WebMethod(EnableSession = true)]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string RenderUserControl(string path,
              List<KeyVal> properties)
        {
            Page pageHolder = new Page();

            UserControl viewControl =
               (UserControl)pageHolder.LoadControl(path);

            viewControl.EnableViewState = false;

            Type viewControlType = viewControl.GetType();

            if (properties != null)
                foreach (var pair in properties)
                {
                    if (pair.Key != null)
                    {
                        PropertyInfo property =
                            viewControlType.GetProperty(pair.Key);

                        if (property != null)
                        {
                            if (pair.Value != null) property.SetValue(viewControl, pair.Value, null);
                        }
                        else
                        {
                            throw new NotImplementedException(string.Format(
                                                                  "UserControl: {0} does not have a public {1} property.",
                                                                  path, pair.Key));
                        }
                    }
                }

            //Form control is mandatory on page control to process User Controls
            HtmlForm form = new HtmlForm();

            //Add user control to the form
            form.Controls.Add(viewControl);

            //Add form to the page 
            pageHolder.Controls.Add(form);

            //Write the control Html to text writer
            StringWriter textWriter = new StringWriter();

            //execute page on server 
            HttpContext.Current.Server.Execute(pageHolder, textWriter, false);

            // Clean up code and return html
            return cleanHtml(textWriter.ToString());
        }
    }
}

, и вот плагин, который обеспечивает загрузку usercontrol;оба кода хорошо работают с этим примером:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script src="js/jquery.js" type="text/javascript"></script>
    <script src="js/jquery.advloaduc.js" type="text/javascript"></script>
    <script src="js/json2.js" type="text/javascript"></script>

    <script type="text/javascript">
        function showAlert() {
            alert('finished!');
        }

        var fileName = 'part1.ascx';
        var props = [{ 'Key': 'Text1', 'Value': 'test1' }, { 'Key': 'Text2', 'Value': 'test2'}];

        var jsonText = JSON.stringify({ path: fileName, properties: props });

        $(document).ready(function() {
            $("#loadMyUc").advloaduc({
                webServiceName: 'Ajax.asmx',
                renderUCMethod: 'RenderUserControl',
                ucMethodJsonParams: jsonText,
                completeHandler: showAlert
            });
        });

    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div id="loadMyUc" align="center">
    </div>
    </form>
</body>
</html>

Но я хочу сделать Postback и серверные действия в Loaded UserControl.Является ли это возможным ?когда я делаю обратную передачу в загруженном usercontrol, происходит ошибка: Viewstate поврежден, есть ли способ существовать?Нужно ли загружать образец с этим кодом для лучшего просмотра?

1 Ответ

2 голосов
/ 02 апреля 2011

Без первоначального рендеринга UserControl в рамках стандартного жизненного цикла страницы события обратной передачи не могут быть должным образом обработаны - ваш WebService не будет отслеживать ViewState способом, доступным для остального контекста AppDomain.

Это довольно сложное решение, которое у вас есть, но может быть проще: 1. вручную обработать AJAX из WebService или 2. включить (динамически или иным образом) экземпляр UserControl на страницу и использовать jQuery для его размещения на странице.

И, хотя мне не нравится рекомендовать UpdatePanels, это может быть вариантом, позволяющим избежать необходимости переписывать свой UserControl для использования AJAX, а не традиционной модели постбэк, но все же дает вам универсальность динамической загрузки UserControl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...