Ext.NET: 如何在加载器中渲染局部视图

Ext.NET: How to render a partial view in a loader

我正在尝试在我的网格中展开一行时加载部分视图。我的听众看起来像这样:

x.RowExpander()
    .Listeners(ls =>
    {
        ls.Expand.Handler = string.Format("Item.onListRowExpand('{0}', {1}, this);",
            Url.Action("ItemDetail", "My"), Model);
    })

这调用了一个 JavaScript 函数:

onListRowExpand: function(url, listId, expander) {
    var container = App.DashboardPanel;
    var itemId = expander.componentsCache[0].cmp.record.data.Id;
    var panelId = "Details_" + listId + "_" + itemId;

    // Check if the selected panel was selected again. If it was do nothing
    var panel = container.getComponent(panelId);
    if (!panel) {

        // Remove the opened panel so we can add a new one
        if (container.items.getCount() > 1) {
            container.remove(container.items.getAt(1).id);
        }

        // Add the new panel...
        container.add({
            id: panelId,
            closeable: true,
            loader: {
                xtype: "panel",
                url: url,
                renderer: "frame",
                params: {
                    "listId": listId,
                    "itemId": itemId                   }
            }
        });

        container.update();
    }
}

此方法然后调用控制器:

public Ext.Net.MVC.PartialViewResult ItemDetail(int listId, int itemId)
{
    var result = new Ext.Net.MVC.PartialViewResult
    {
        RenderMode = RenderMode.AddTo,
        ContainerId = "MyPanel",
        WrapByScriptTag = false,
        Model = new ItemViewModel
        {
            ListId = listId,
            ItemId = itemId
        }
    };

    return result;
}

这应该是 return 要添加到容器 Items:

的部分视图
@(x.Container()
    .ID("MyPanel")
    .Layout(LayoutType.HBox)
    .Loader(x.ComponentLoader()
        .Url(Url.Action("ViewList", "My"))
        .Mode(LoadMode.Script)
        .Params(new { listId = Model.ListId })))

视图如下所示:

@model ItemViewModel
@{
    var x = Html.X();
}

@(x.Panel()
   .LayoutConfig(new HBoxLayoutConfig {Align = HBoxAlign.StretchMax})
    .Flex(1)
    .Items(
        x.Button().Text("Temp").Flex(1)))

我的问题是我似乎无法渲染局部视图。如果我将 WrapByScriptTag 设置为 true,它会返回一个白框 - 在这种情况下,我会收到一条错误消息 "Uncaught ReferenceError: Ext is not defined"),或者如果我设置 WrapByScriptTag 为假。我知道我在某处遗漏了一个设置,但我不确定出了什么问题。任何帮助将不胜感激。

我的解决方案是将我的控制器更改为使用 RenderMode.Config,并将加载器上的 renderer 选项从 "frame" 更改为 "component"。据我了解,不同之处在于 frame 选项告诉 Ext.JS 期望一个 IFrame(即完全形成的 HTML),而 component 选项用于描述 Ext 组件。这是问题的一半。另一半是我试图渲染组件,以便将其添加到另一个容器的 Items 字段中,但请求源自对 add 的调用,因此这是不必要的。相反,将组件呈现为配置更有意义,因为它是局部视图。

请注意,这适用于 Ext.NET 4.2.0 但不适用于 Ext.NET 4.1.0。在这种情况下,选择 renderer: "script" 解决了问题。