Заполните раскрывающийся список в моем представлении MVC из пользовательских таблиц Kentico. - PullRequest
0 голосов
/ 04 июня 2019

Используя Kentico 12 MVC, я создал пользовательскую таблицу для хранения информации, используемой для заполнения раскрывающегося списка в моем представлении.

Она называется MyCustom.Tables и добавила поля «ProgramName» и «ProgramID»с соответствующей информацией

Как я могу передать их на мой взгляд?Я попытался в моем контроллере:

IEnumerable<ProgramList> allPrograms = CustomTableItemProvider.GetItems<ProgramList>("MyCustom.Tables"); 

, а затем, на мой взгляд:

@Html.DropDownListFor(m => m.Data.ProgramSelected, new SelectList(Model.Data.AllPrograms, "ProgramID", "ProgramName"), "- Please Select -", new { @class = "browser-default" }) 

со следующей моделью

public class ProgramList
{
    public string ProgramID { get; set; }
    public string ProgramName { get; set; }
}

Но я получаю ошибку вконтроллер (нет перегрузки для метода GetItems принимать 1 аргумент) ...

Я также пытался изменить контроллер на

IEnumerable allPrograms = CustomTableItemProvider.GetItems("MyCustom.Tables"); 

Но мои настраиваемые поля из моей пользовательской таблицы не доступны в этомcase только поле ItemID по умолчанию Kentico.

Есть идеи?

S.

######################### EDIT

Iдобавили следующий код, сгенерированный Kentico:

using System;
using System.Collections.Generic;

using CMS;
using CMS.Base;
using CMS.Helpers;
using CMS.DataEngine;
using CMS.CustomTables.Types.MySite;
using CMS.CustomTables;

[assembly: RegisterCustomTable(ProgramsItem.CLASS_NAME, typeof(ProgramsItem))]

namespace CMS.CustomTables.Types.MySite
{
    /// <summary>
    /// Represents a content item of type ProgramsItem.
    /// </summary>
    public partial class ProgramsItem : CustomTableItem
    {
        #region "Constants and variables"

        /// <summary>
        /// The name of the data class.
        /// </summary>
        public const string CLASS_NAME = "MySite.Programs";


        /// <summary>
        /// The instance of the class that provides extended API for working with ProgramsItem fields.
        /// </summary>
        private readonly ProgramsItemFields mFields;

        #endregion


        #region "Properties"

        /// <summary>
        /// Name.
        /// </summary>
        [DatabaseField]
        public string ProgramName
        {
            get
            {
                return ValidationHelper.GetString(GetValue("ProgramName"), @"");
            }
            set
            {
                SetValue("ProgramName", value);
            }
        }


        /// <summary>
        /// Gets an object that provides extended API for working with ProgramsItem fields.
        /// </summary>
        [RegisterProperty]
        public ProgramsItemFields Fields
        {
            get
            {
                return mFields;
            }
        }


        /// <summary>
        /// Provides extended API for working with ProgramsItem fields.
        /// </summary>
        [RegisterAllProperties]
        public partial class ProgramsItemFields : AbstractHierarchicalObject<ProgramsItemFields>
        {
            /// <summary>
            /// The content item of type ProgramsItem that is a target of the extended API.
            /// </summary>
            private readonly ProgramsItem mInstance;


            /// <summary>
            /// Initializes a new instance of the <see cref="ProgramsItemFields" /> class with the specified content item of type ProgramsItem.
            /// </summary>
            /// <param name="instance">The content item of type ProgramsItem that is a target of the extended API.</param>
            public ProgramsItemFields(ProgramsItem instance)
            {
                mInstance = instance;
            }


            /// <summary>
            /// Name.
            /// </summary>
            public string ProgramName
            {
                get
                {
                    return mInstance.ProgramName;
                }
                set
                {
                    mInstance.ProgramName = value;
                }
            }
        }

        #endregion


        #region "Constructors"

        /// <summary>
        /// Initializes a new instance of the <see cref="ProgramsItem" /> class.
        /// </summary>
        public ProgramsItem() : base(CLASS_NAME)
        {
            mFields = new ProgramsItemFields(this);
        }

        #endregion
    }
}

и попробовали следующий код https://docs.kentico.com/k12/developing-websites/retrieving-content-in-mvc-applications, но в настоящее время он не работает:

    IEnumerable<ProgramsItem> allPrograms = CustomTableItemProvider.GetItems<ProgramsItem>();
    ProgramsItem item = CustomTableItemProvider.GetItem<ProgramsItem>(1);

Например, приведенный выше пункт возвращает ноль, пока у меня есть записи в моих пользовательских таблицах.

На основе https://www.bizstream.com/blog/may-2019/powerful-kentico-custom-table-visualization Я также пытался

    IEnumerable<ProgramList> GetAllPrograms = CustomTableItemProvider.GetItems<ProgramsItem>()
        .Select(program => new ProgramList
        {                    
            ProgramName = program.ProgramName
        });

, но получаю снова:

Невозможно привести объект типа 'CMS.CustomTables.CustomTableItem' к типу 'CMS.CustomTables.Types.MySite.ProgramsItem'.

Спасибо

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Если в ProgramList сгенерирован код из таблицы пользовательских кодов (пользовательские таблицы -> Правка -> Код -> Сохранить код и включить его в решение), то вы должны вызывать его без указания className:

CustomTableItemProvider.GetItems<ProgramList>(); 

Это позволит вам получить доступ к свойствам пользовательских таблиц напрямую (строго типизированные результаты).

Если ProgramList - ваш пользовательский класс, как отмечено в вопросе, тогда вы должны вызывать его только с className (без указания типа объекта).Чтобы получить доступ к пользовательскому элементу, используйте GetValue (GetStringValue, GetBooleanValue и т. Д.), Например:

allPrograms[0].GetValue("CustomFieldname")
0 голосов
/ 04 июня 2019

После обсуждения здесь: https://devnet.kentico.com/questions/unable-to-cast-object-of-type-cms-customtables-customtableitem-to-type и https://docs.kentico.com/k12/developing-websites/generating-classes-for-kentico-objects

Я должен добавить

using CMS;
[assembly: AssemblyDiscoverable] 

в моем сгенерированном классе, чтобы сделать его доступным.

IEnumerable<ProgramList> GetAllPrograms = CustomTableItemProvider.GetItems<ProgramsItem>()
    .Select(program => new ProgramList
    {                    
        ProgramName = program.ProgramName
    });

теперь отлично работает.

S.

...