Как использовать этот пользовательский контроль? - PullRequest
1 голос
/ 19 августа 2009

http://www.codeproject.com/KB/ajax/TunaUpdatepanel3.aspx

Ссылка выше содержит класс, который расширяет пользовательский контроль UpdatePanel. Как мне импортировать его в проект и использовать его как пользовательский контроль следующим образом:

<uc:TunaUpdatePanel ... runat="server" />

ОБНОВЛЕНИЕ № 1:

Предлагаемое решение перемещения кода в файл ascx не работает.

Ниже приведены два файла, которые я создал для тестирования решения, в котором WebForm.aspx ссылается на TunaUpdatePanelUC.ascx.

TunaUpdatePanelUC.ascx

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Text.RegularExpressions;
using System.IO;

    public class TunaUpdatePanelUC : UpdatePanel
    {
        private static readonly Regex REGEX_CLIENTSCRIPTS = new Regex(
        "<script\\s((?<aname>[-\\w]+)=[\"'](?<avalue>.*?)[\"']\\s?)*\\s*>(?<script>.*?)</script>",
        RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled |
        RegexOptions.ExplicitCapture);
        private bool m_RegisterInlineClientScripts = true;

        /// <summary>
        /// If the updatepanel shall parse and append inline scripts, default true
        /// </summary>
        public bool RegisterInlineClientScripts
        {
            get
            {
                return this.m_RegisterInlineClientScripts;
            }
            set
            {
                this.m_RegisterInlineClientScripts = value;
            }
        }

        protected virtual string AppendInlineClientScripts(string htmlsource)
        {
            if (this.ContentTemplate != null && htmlsource.IndexOf(
                "<script", StringComparison.CurrentCultureIgnoreCase) > -1)
            {
                MatchCollection matches = REGEX_CLIENTSCRIPTS.Matches(htmlsource);
                if (matches.Count > 0)
                {
                    for (int i = 0; i < matches.Count; i++)
                    {
                        string script = matches[i].Groups["script"].Value;
                        string scriptID = script.GetHashCode().ToString();
                        string scriptSrc = "";

                        CaptureCollection aname = matches[i].Groups["aname"].Captures;
                        CaptureCollection avalue = matches[i].Groups["avalue"].Captures;
                        for (int u = 0; u < aname.Count; u++)
                        {
                            if (aname[u].Value.IndexOf("src",
                                StringComparison.CurrentCultureIgnoreCase) == 0)
                            {
                                scriptSrc = avalue[u].Value;
                                break;
                            }
                        }

                        if (scriptSrc.Length > 0)
                        {
                            ScriptManager.RegisterClientScriptInclude(this,
                                this.GetType(), scriptID, scriptSrc);
                        }
                        else
                        {
                            ScriptManager.RegisterClientScriptBlock(this, this.GetType(),
                                scriptID, script, true);
                        }

                        htmlsource = htmlsource.Replace(matches[i].Value, "");
                    }

                }
            }
            return htmlsource;
        }

        protected override void RenderChildren(HtmlTextWriter writer)
        {
            ScriptManager sm = ScriptManager.GetCurrent(Page);
            if (this.RegisterInlineClientScripts && sm != null && sm.IsInAsyncPostBack)
            {
                using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new StringWriter()))
                {
                    base.RenderChildren(htmlwriter);

                    string html;
                    int outputSize;

                    //Get the actual rendering and size
                    html = htmlwriter.InnerWriter.ToString();
                    outputSize = html.Length;

                    //Append inlinescripts and fetch the new markup and size
                    html = this.AppendInlineClientScripts(html);
                    outputSize -= html.Length;

                    //Replace ContentSize if there are any gains
                    if (outputSize > 0)
                    {
                        html = this.SetOutputContentSize(html, outputSize);
                    }

                    writer.Write(html);
                }
            }
            else
            {
                base.RenderChildren(writer);
            }
        }

        private string SetOutputContentSize(string html, int difference)
        {
            string[] split = html.Split('|');
            int size = int.Parse(split[0]);
            split[0] = (size - difference).ToString();
            return string.Join("|", split);
        }
    }

WebForm.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="WebApplication1.WebForm" %>
<%@ Register TagPrefix="uc" TagName="TunaUpdatePanel" Src="~/TunaUpdatePanelUC.ascx" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

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

    <div>
        <uc:TunaUpdatePanel ID="Test1"  runat="server" />
    </div>
    </form>
</body>
</html>

Сообщение об ошибке:

Ошибка парсера Описание: во время анализа ресурса, необходимого для обслуживания этого запроса, произошла ошибка. Пожалуйста, просмотрите следующую конкретную информацию об ошибке разбора и измените исходный файл соответствующим образом.

Сообщение об ошибке анализатора: «WebApplication1.TunaUpdateUC» здесь не разрешено, поскольку оно не расширяет класс «System.Web.UI.UserControl».

Ошибка источника:

Строка 1: <% @ Control Language = "C #" AutoEventWireup = "true" CodeBehind = "TunaUpdatePanelUC.ascx.cs" Inherits = "WebApplication1.TunaUpdateUC"%>

Ответы [ 4 ]

3 голосов
/ 19 августа 2009

Сохранить исходный код в файл в вашем проекте. Затем зарегистрируйте его на странице, которую хотите использовать, добавив в начало директиву register, например:

<%@ Register TagPrefix="uc" TagName="TunaUpdatePanel" Src="~/[path]"

где path - путь к файлу, в котором вы сохранили пользовательский элемент управления.

Смотрите здесь для получения аналогичной информации - просто забудьте часть, где вы сами создаете пользовательский элемент управления.

Редактировать : Глупый я, я предположил, что на самом деле это был код для пользовательского элемента управления, основанный на названии вашего вопроса, и не слишком внимательный взгляд на ссылку.

Ну, это не пользовательский элемент управления, поскольку (как говорит ошибка разбора) он не расширяется System.Web.UI.UserControl. Он расширяет UpdatePanel, что означает, что вы должны использовать его так же, как и UpdatePanel (как сказано на веб-сайте). Обычно пользовательский элемент управления имеет половину foo.ascx (разметка) и код foo.ascx.cs (или .vb, если вы качаетесь таким образом). Тем не менее, это всего лишь код позади.

Посмотрите здесь и здесь как использовать расширитель управления сервером. У меня сейчас нет времени, чтобы подробно их изучить, но я думаю, они помогут вам в правильном направлении. Краткая версия: похоже, вам нужно скомпилировать код C # в сборку.

2 голосов
/ 19 августа 2009

Предполагая, что вы вырезали и вставили этот код в какой-то файл в вашем проекте (скажем, вы получили его в Controls \ TunaUpdatePanel.ascx ", вам нужно добавить это в свой файл web.config следующим образом:

<pages>
   <controls>
      <add src="~/Controls/TunaUpdatePanel.ascx" tagPrefix="uc" tagName="TunaUpdatePanel"/>
   </controls>
</pages>

Редактировать: ответ Мэтта Болла также правильный. Делая это по-своему, вы добавите эту строку вверху любой страницы, которая использует этот элемент управления. Делая это таким образом, вы, по сути, будете регистрировать его для всего приложения. Ваш выбор, который вы предпочитаете.

0 голосов
/ 22 февраля 2012

У меня была похожая проблема (я пытался расширить TextBox, чтобы иметь атрибут-заполнитель HTML5).

После настройки файла ASCX (см. Ниже) я следовал этим инструкциям и перетаскивал новый элемент управления на свою страницу, где он был добавлен (где ProjName - это имя проекта, а NameSpace - пространство имен, содержащее контроль):

<%@ Register assembly="ProjName" namespace="NameSpace" tagprefix="cc1" %>
<cc1:TextBox_Plus ID="TextBox_Plus1" runat="server" />

TextBox_Plus.ascx.vb Открытый класс TextBox_Plus Унаследован от System.Web.UI.WebControls.TextBox

    Public Property PlaceHolder As String
        Get
            Return Attributes("placeholder")
        End Get
        Set(value As String)
            Attributes("placeholder") = value
        End Set
    End Property

End Class

Или версия C #:
TextBox_Plus.ascx.cs

public class TextBox_Plus : System.Web.UI.WebControls.TextBox
{
    public string PlaceHolder {
        get { return Attributes["placeholder"]; }
        set { Attributes["placeholder"] = value; }
    }
}
0 голосов
/ 30 августа 2009

Этот элемент управления предназначен для использования именно в качестве исходной панели обновления ASP.NET, а не в качестве пользовательского элемента управления.

Вставьте исходный код в файл * .cs. Добавьте файл в ваш текущий проект ASP.NET. Измените пространство имен на свое собственное пространство имен, чтобы избежать работы с web.config.

Затем он должен появиться на панели инструментов в vs2005 и перетащить его на страницу, как любой другой элемент управления.

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