簡體   English   中英

Kendo MVC網格具有多選列。 行為空引用

[英]Kendo mvc grid with multiselect column. Row is null reference

我有兩個具有“多對多”關系的模型,即書籍,作者及其上下文庫。 正確包含了所有源文件。 無法將選定的作者設置為該單元格(因為行為空,因此無法設置模型)。 使用InCell編輯器。 任何想法我都會很高興)

UPD:添加新行時發​​生新錯誤

無法獲取未定義或空引用的屬性“地圖”

Index.cs.html :(更改函數錯誤,dataBound函數第二個錯誤)

 @{
    ViewBag.Title = "Home Page";
}
@(Html.Kendo().Grid<ManyToMany.Models.ViewModel>()
                .Name("grid")
                .Columns(columns =>
                {
                    columns.Bound(e => e.BookId).Visible(false);
                    columns.Bound(e => e.Pages);
                    columns.Bound(e => e.Genre);
                    columns.Bound(e => e.Publisher);
                    columns.Bound(e => e.Authors).ClientTemplate(

                         Html.Kendo().MultiSelect().Name("multi#=BookId#")
                            .DataTextField("AuthorName")
                            .DataValueField("AuthorId")
                            .BindTo((IEnumerable<ManyToMany.Models.Author>)ViewData["authors"]) /*TaskSecond.Models.ViewModel*/
                            .Events(e => e.Change("change"))
                            .ToClientTemplate().ToHtmlString()
                        );
                    columns.Command(command => command.Destroy()).Width(150);

                })
                .ToolBar(toolbar =>
                {
                    toolbar.Create();
                    toolbar.Save();
                })
                .Editable(editable => editable.Mode(GridEditMode.InCell))
                                                    .Pageable()
                                                    .Filterable()
                .Events(e => e.DataBound("dataBound"))
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .Batch(true)
                .Model(model =>
                {
                    model.Id(p => p.BookId);
                    model.Field(p => p.Pages).DefaultValue(0);
                    model.Field(p => p.Genre).DefaultValue(0);
                    model.Field(p => p.Publisher).DefaultValue("");
                    model.Field(p => p.Authors).DefaultValue(
                        ViewData["defaultAuthors"] as ManyToMany.Models.Author);
                })
                    .PageSize(5)
                     .Read(read => read.Action("Books_Read", "Grid"))
        .Create(create => create.Action("Books_Create", "Grid"))
         .Update(update => update.Action("Books_Update", "Grid"))
        .Destroy(destroy => destroy.Action("Books_Destroy", "Grid"))
                    .ServerOperation(false))
)

<script type="text/javascript">
    function dataBound(e) {
        var grid = this;
        grid.tbody.children().each(function () {
            var dataitem = grid.dataItem(this),
                row = $(this);
            eval(row.find("script").html());
            var multiSelect = $(this).find("select").data("kendoMultiSelect");
            //here
            multiSelect.value(dataitem.Authors.map(function (i) { return i.AuthorId }));
        });
    }

    function change(e) {
//error is here
        var row = this.element.closest("tr"),
            model = $("#grid").data("kendoGrid").dataItem(row);
        model.set("Authors", this.dataItems());
    }

</script>

ViewModel.cs:

 public class ViewModel
{
    public ViewModel()
    {
        Authors = new List<Author>();
    }
    public int BookId { get; set; }

    public string BookName { get; set; }

    public int Pages { get; set; }

    public Genre Genre { get; set; }

    public string Publisher { get; set; }
    [UIHint("AuthorsEditor")]
    public List<Author> Authors { get; set; }
}

嘗試在change()JavaScript函數中使用-this.select()代替this.element.closest。 您可能需要優化以下代碼以適合您的要求,但這會讓您對調試過程中要更改的內容有所了解:

var row = this.select();
if (row.length > 0 )
{
    selectedRow = e.sender.select();
    var item = e.sender.dataItem(selectedRow);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM