Chriz12 Ответов: 2

Функция Javascript не работает на странице содержимого


Привет,

Я пытаюсь заполнить выпадающий список, имея данные в группах, на странице контента. Я использую базу данных Northwind. Вот мой код:

SQL Server
CREATE PROCEDURE EmployeesSelect
AS
BEGIN
	SET NOCOUNT ON;

	SELECT EmployeeID,FirstName,TitleOfCourtesy 
	FROM dbo.Employees
END
GO

HTML
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <asp:DropDownList ID="ddlNames" runat="server"></asp:DropDownList>
    <script type="text/javascript">
        $(function () {    
         GroupDropdownlist('ddlNames')
        });
 function GroupDropdownlist(id) {
            var selectControl = $('#' + id);
            var groups = [];
            $(selectControl).find('option').each(function () {
                groups.push($(this).attr('data-group'));
            });
            var uniqueGroup = groups.filter(function (itm, i, a) {
                return i == a.indexOf(itm);
            });
            $(uniqueGroup).each(function () {
                var Group = jQuery('<optgroup/>', { label: $(this)[0] }).appendTo(selectControl);
                var grpItems = $(selectControl).find('option[data-group="' + $(this)[0] + '"]');
                 $(grpItems).each(function () {
                    var item = $(this);
                    item.appendTo(Group);
                });
            });
        }

    </script>
    
</asp:Content>

С#
protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                ddlNames.Items.Clear();
                ddlNames.Items.Add(new ListItem("", "0"));

                ddlNames.AppendDataBoundItems = true;

                string str = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
                SqlConnection conn = new SqlConnection(str);
                conn.Open();
                SqlCommand sqlCmd = new SqlCommand("dbo.EmployeesSelect", conn);
                SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
                sqlCmd.CommandType = CommandType.StoredProcedure;
                DataTable dt = new DataTable();
                sqlDa.Fill(dt);

                foreach (DataRow row in dt.Rows)
                {
                    ListItem item = new ListItem();
                    item.Text = row["FirstName"].ToString();
                    item.Value = row["EmployeeID"].ToString();
                    item.Attributes["data-group"] = row["TitleOfCourtesy"].ToString();
                    ddlNames.Items.Add(item);
                }
                conn.Close();
            }
        }

Несмотря на то, что код работает на одной странице, Я не могу получить данные в группах, когда использую их на главной странице/странице содержимого.

Мы будем признательны за любую помощь.

Что я уже пробовал:

1. создал файл .js и добавил функцию, импортировав файл .js на главную страницу.

F-ES Sitecore

Ваш код опирается на данные и файловые структуры, к которым мы не можем получить доступ, поэтому никто не может отладить это для вас, вам придется научиться отлаживать самостоятельно.

Если он работает на обычной странице, но не master\content, то вероятными проблемами являются идентификаторы элементов управления и пути к js-файлам. Ваш выпадающий список, кажется, содержит список идентификаторов элементов управления, но являются ли эти идентификаторы правильными? Существуют ли на странице элементы управления с этими идентификаторами? И я имею в виду в исходном html-коде, когда ваш js работает, а не в вашем файле aspx.

Ищите сообщения об ошибках в консоли браузера и используйте оператор "отладчик", чтобы пройти через ваш js строка за строкой и попытаться получить представление о том, что не работает, например, возвращает ли эта строка значение?

var selectControl = $('#' + id);

и так далее.

2 Ответов

Рейтинг:
2

GKP1992

Либо напишите Javascript на главной странице, либо зарегистрируйте скрипт из кода, лежащего в основе, используя класс ClientScriptManager. Дополнительная информация о менеджер клиентского сценария здесь.


Chriz12

Спасибо за ответ,я попробовал оба ваших предложения, но все равно получаю результаты без группировки.

Рейтинг:
2

Richard Deeming

Вы используете главную страницу, поэтому идентификаторы элементов управления на странице содержимого будут "искажены". Если вы просмотрите визуализированный источник страницы, то увидите, что там нет элемента с идентификатором "ddlNames".

У вас есть два варианта:

1) Добавить ClientIDMode="Static" к вашему контролю:

<asp:DropDownList ID="ddlNames" runat="server" ClientIDMode="Static"></asp:DropDownList>
Контроль.Свойство ClientIDMode (System.Web.UI)[^]

2) вколоть ClientID свойство в скрипте:
<asp:DropDownList ID="ddlNames" runat="server"></asp:DropDownList>

<script type="text/javascript">
$(function () {    
    GroupDropdownlist('<%= ddlNames.ClientID %>');
});
NB: Это работает только в том случае, если сценарий объявлен встроенным. Если вы переместите скрипт на внешнее устройство .js файл, это не сработает.


Chriz12

Спасибо за ответ, я изменил код, как было предложено, и теперь я получаю как имена, так и TitleOfCourtesy на одном уровне выпадающего списка вместо группировки имен на основе TitleOfCourtesy (хотя у меня нет выбора выбора TitleoOfCourtesy)