Telerik grid не отображает выпадающий список в столбце MVC3 - PullRequest
0 голосов
/ 03 сентября 2011

У меня есть проблема с сеткой Telerik, которая, кажется, нигде не может найти достаточно точную проблему.Я слежу за демонстрацией с их сайта для шаблонов редактирования на стороне клиента.При переходе в режим редактирования он сразу же умирает, говоря, что * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100, * * 1007, * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * «Это не…1008 *

Function GetPageContent() As ActionResult

    Try
        ViewData("PageList") = SharedListDataRepository.PageList()

        Return PartialView()

    Catch ex As Exception
        Throw
    End Try

End Function

Вот мой помощник для загрузки данных списка:

Public Shared Function PageList() As IEnumerable(Of ApplicationPage)

    Dim l As IEnumerable(Of ApplicationPage)

    Try
        l = (From d In New AdminIndustrySetupDataContext(TripleDESSecurity.Decrypt(SharedData.PortalCnx)).AdminApplicationPages Order By d.ID Select New ApplicationPage With {
                .ID = d.ID,
                .PageName = d.PageName
        }).AsEnumerable

        Return l

    Catch ex As Exception
        Throw
    Finally
        If Not l Is Nothing Then
            l = Nothing
        End If
    End Try

End Function 

Вот моя модель: как вы можете видеть, она украшена UIHint, который должен принестиконтроль в представлении, но потому что ошибка является ошибкой js для «неопределенного» элемента, который говорит мне, что элемент управления списком никогда не попадает на страницу.С чем согласен Firebug, его просто нет в HTML

Imports System.ComponentModel.DataAnnotations
Imports System.Runtime.Serialization

<KnownType(GetType(IndustryPageContent))> _
Public Class IndustryPageContent

    <ScaffoldColumn(False)> _
    Public Property ID As Integer = 0
    Public Property IndustryID As Integer = 0
    <UIHint("PageList"), Required()> _
    Public Property PageID As Integer = 0
    Public Property PageActionID As Integer = 0
    Public Property Content1 As String = String.Empty
    Public Property Content2 As String = String.Empty
    Public Property Content3 As String = String.Empty
    Public Property Content4 As String = String.Empty
    Public Property Content5 As String = String.Empty

    Public Sub New()
        MyBase.New()
    End Sub

End Class

И, наконец, вот мой элемент управления списком:

<%@ Control Language="vb" Inherits="System.Web.Mvc.ViewUserControl" %>

<% Html.Telerik().DropDownList() _
        .Name("PageList") _
        .BindTo(New SelectList(CType(ViewData("PageList"), IEnumerable), "ID", "PageName"))
%>

Так что я предполагаю, что javascript для метода select не работает, потому чтоUIHint неправильно связывает элемент управления, поэтому отсутствует элемент управления для вызова метода select.

Чего мне не хватает?Существуют ли успешные реализации сетки Telerik с привязкой Ajax - с редактированием, с использованием VB.NET и aspx, а не бритвой?Или я единственный, кто загнал меня в угол с ограничениями, с которыми мне приходится работать?

У меня не было ничего, кроме проблем с использованием демонстраций Telerik, они постоянно неполные и / или используют противоречие методовэта поддержка в конечном итоге говорит: «О, вы не можете сделать это, когда делаете это. Правда? Так почему же это в демоверсии ??

РЕДАКТИРОВАТЬ

Это окончательный коддля моей сетки, которая заработала:

 <% Html.Telerik().Grid(Of IndustryPageContent)() _
        .Name("IndustryPageContent") _
        .DataKeys(Function(k) k.Add(Function(d) d.ID)) _
        .DataBinding(Function(db) db.Ajax() _
                    .Select("_GetPageContent", "Industry") _
                    .Update("_SetPageContent", "Industry")) _
        .Columns(Function(c) c.Bound(Function(d) d.IndustryID)) _
        .Columns(Function(c) c.Bound(Function(d) d.PageID)) _
        .Columns(Function(c) c.Bound(Function(d) d.PageActionID)) _
        .Columns(Function(c) c.Bound(Function(d) d.Content1)) _
        .Columns(Function(c) c.Bound(Function(d) d.Content2)) _
        .Columns(Function(c) c.Bound(Function(d) d.Content3)) _
        .Columns(Function(c) c.Bound(Function(d) d.Content4)) _
        .Columns(Function(c) c.Bound(Function(d) d.Content5)) _
        .Columns(Function(c) c.Command(Function(d) d.Edit().ButtonType(GridButtonType.Image)).Width(60)) _
        .Columns(Function(c) c.Bound(Function(d) d.ID).Hidden()) _
        .Editable(Function(c) c.Mode(GridEditMode.InForm).Enabled(True)) _
        .Scrollable(Function(s) s.Height("350px")) _
        .Pageable() _
        .Selectable() _
        .Render()
%>

Линия ClientEvents и JS не нужны. Свойство «Имя» выпадающего списка должно совпадать с именем свойства, которое будет списком.for. В данном случае PageID и PageActionID. Это код для 2 DDL, который я определил для этой работы:

<%@ Control Language="vb" Inherits="System.Web.Mvc.ViewUserControl" %>

<% Html.Telerik().DropDownList() _
    .Name("PageID") _
    .BindTo(New SelectList(CType(ViewData("PageList"), IEnumerable), "ID", "PageIDandName")) _
    .Render()
%>

<%@ Control Language="vb" Inherits="System.Web.Mvc.ViewUserControl" %>

<% Html.Telerik().DropDownList() _
        .Name("PageActionID") _
        .BindTo(New SelectList(CType(ViewData("PageActionList"), IEnumerable), "PageActionID", "PageActionIDandAction")) _
        .Render()
%>

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Какова правильная реализация метода OnEdit? Вы вставили два разных фрагмента кода:

function onEdit(e) {
  $(e.form).find('#ProductCategoryName').data('tDropDownList').select(function (dataItem) {
        return dataItem.Text == e.dataItem['ProductCategoryName'];
   });
}

и

function onEdit(e) {
   $(e.form).find('#PageList').data('tDropDownList').select(function (dataItem) {
        return dataItem.Text == e.dataItem['PageName'];
   });
}

Первый не будет работать, потому что имя выпадающего списка - «PageList», а не «ProductCategoryName». jQuery возвращает пустой результат, а .data ("tDropDownList") возвращает ноль. Вот почему нет метода «выбора».

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

UPDATE: Я думаю, что я видел, в чем проблема. Ваш DropDownList никогда не выводится, потому что вы используете блок <%%> вместо <%:%> или вызываете Render (); метод. Пожалуйста, измените ваш код следующим образом

<% Html.Telerik().DropDownList() _
        .Name("PageList") _
        .BindTo(New SelectList(CType(ViewData("PageList"), IEnumerable), "ID", "PageName")) _
        .Render()
%>

или это:

<%: Html.Telerik().DropDownList() _
        .Name("PageList") _
        .BindTo(New SelectList(CType(ViewData("PageList"), IEnumerable), "ID", "PageName"))
%>
0 голосов
/ 04 сентября 2011

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

Вы правы: ваш select () не работает, потому что UIHint по какой-то причине не получает ваш редактор, поэтому строка:

$(e.form).find('#ProductCategoryName').data('tDropDownList').select(function...

не находит ваш DDL.Я никогда не получал UIHint для работы со связыванием на стороне клиента.Нельзя сказать, что это не может работать;может я просто идиотНо попробуйте использовать ClientTemplate / EditorTemplate.Это будет связанный столбец, который выглядит примерно так:

.Columns(Function(c) c.Bound(Function(d) d.ProductCategory)).ClientTemplate("<#= ProductCategory ? ProdcutCategoryName : '' #>").EditorTemplateName("CategorySelector");

.select () - неправильная функция, используемая здесь.попробуйте это:

onEdit(e){
    $ddl = $(e.cell).find('#ProductCategoryName');
    if($ddl.length > 0) {
        var ddl = $ddl.data('tDropDownList');
        ddl.fill(function(){
            if (e.dataItem['ProductCategory'] != null){
                    ddl.value(e.dataItem['ProductCategory'].Id)
            }
        });
     }
 }

Это позволит убедиться, что ddl действительно существует, и убедиться, что ProductCategory действительно определена.ddl.fill () гарантирует, что элемент выбран, так как ddl привязан.ddl.value ('') устанавливает значение ddl, которое выбирает нужный элемент.В зависимости от того, насколько плоской является ваша модель, вы можете немного ее убрать;Я обычно позволяю своим объектам ViewModel углубляться в один.Это добавляет небольшую сложность на стороне клиента, но у меня нет выбора, кроме как совершить как можно меньше поездок на сервер.

edit : если вы действительно хотите использоватьUIHint по какой-либо причине, вы прочитали эту страницу?

...