使用带有ASP.Net MVC的CallBacks在Popup中加载选定的GridView项

时间:2017-07-21 09:13:20

标签: javascript c# asp.net asp.net-mvc devexpress

我仍然相对较新的ASP.Net和客户端与服务器之间的通信概念。我正在使用DevExpress工具,但我相信这个问题更多的是对这个概念的误解。

我在部分视图中有一个GridView,它通过Action @Html.Action('MessageGridView')加载。这没有问题,并且索引和返回的模型可以很好地加载数据。

@Html.DevExpress().GridView(settings =>
{
    settings.Width = System.Web.UI.WebControls.Unit.Percentage(100);
    settings.Name = "preparedMessagesGrid";
    settings.CallbackRouteValues = new { Controller = "Messages", Action = "MessagesGridView" };
    settings.KeyFieldName = "Id";
    settings.SettingsBehavior.AllowSelectByRowClick = true;
    settings.SettingsBehavior.AllowSelectSingleRowOnly = true;
    settings.ClientSideEvents.Init = "GridViewInit";
    settings.ClientSideEvents.SelectionChanged = "OnSelectionChanged";
    settings.ClientSideEvents.BeginCallback = "OnBeginCallback";
    settings.SettingsBehavior.AllowEllipsisInText = true;
    settings.PreRender = settings.Init = (sender, e) =>
    {
        MVCxGridView gridView = sender as MVCxGridView;
        gridView.Selection.SelectAll();
    };
    settings.Columns.Add("Name");
    settings.Columns.Add("Description");
}).Bind(Model.preparedMessages).GetHtml()

我想要实现的是当用户选择行时,我希望在单击时将数据加载到弹出控件中。有没有办法可以为弹出控件回调动态设置参数?

@Html.DevExpress().PopupControl(settings =>
{
    settings.Name = "pcModalMode";
    settings.Width = 100;
    settings.AllowDragging = true;
    settings.CloseAction = CloseAction.CloseButton;
    settings.CloseOnEscape = true;
    settings.PopupAnimationType = AnimationType.None;
    settings.HeaderText = "Login";
    settings.Modal = true;
    settings.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
    settings.PopupVerticalAlign = PopupVerticalAlign.WindowCenter;
    settings.CallbackRouteValues = new { Controller = "Messages", Action = "Load", new { id = THIS NEEDS TO BE SELECTED ID VALUE} };
    settings.LoadContentViaCallback = LoadContentViaCallback.OnFirstShow;

}).GetHtml()

如果我将值设置为静态,那么它是有效的,所以我离这个工作只有一步之遥。我研究的是,我可以使用选择更改事件从javascript中获取GridView中的值。

function OnSelectionChanged(s, e) {   
    s.GetSelectedFieldValues("Id", GetSelectedFieldValueCallback);
}

然后我可以检索这个值,但是我可以将它设置为我的弹出控件,或者我误解为相对较新,并且我可以在执行ViewGrid回调时执行此服务器端,然后将其设置为服务器端有某种会话?

1 个答案:

答案 0 :(得分:1)

您只需一步即可通过此功能获取当前选定的网格值:

function OnSelectionChanged(s, e) { 
    s.GetSelectedFieldValues('Id', GetSelectedFieldValueCallback);
}

您需要做的是将GetSelectedFieldValueCallback方法声明为此(我从selectedValue包含单个网格行选择的单个数组的测试得到,使用零索引来分配值):

var id; // a global variable set to hold selected row key value from grid

function GetSelectedFieldValueCallback(selectedValue) {
    if (selectedValue.length == 0) 
        return;

    id = parseInt(selectedValue[0]);

    pcModalMode.PerformCallback();
}

然后在BeginCallback帮助器上设置PopupControl,如下所示,请注意,对于DevExpress HTML帮助程序,您可以在客户端使用customArgs来传递操作方法参数,而不是使用{{1 } CallbackRouteValues参数:

id

最后,让我们把它们放在一起看看&控制器代码:

查看

@Html.DevExpress().PopupControl(settings =>
{
    settings.Name = "pcModalMode";

    // other stuff

    settings.CallbackRouteValues = new { Controller = "Messages", Action = "Load" };
    settings.ClientSideEvents.BeginCallback = "OnPopUpBeginCallback";
    settings.ClientSideEvents.EndCallback = "OnPopUpEndCallback";

    // other stuff
}).GetHtml()

// JS function for popup callback
function OnPopUpBeginCallback(s, e) {
    e.customArgs["id"] = id; // this sends 'id' as action method parameter to `Load` action
}

// Optional end callback
function OnPopUpEndCallback(s, e) {
    if (!pcModalMode.IsVisible())
        pcModalMode.Show();
}

GridView(部分视图)

<!-- View page -->
<script type="text/javascript">
    var id;

    function OnSelectionChanged(s, e) { 
        s.GetSelectedFieldValues('Id', GetSelectedFieldValueCallback);
    }

    function GetSelectedFieldValueCallback(selectedValue) {
        if (selectedValue.length == 0) 
           return;

        id = parseInt(selectedValue[0]);

        pcModalMode.PerformCallback();
    }

    function OnPopUpBeginCallback(s, e) {
        e.customArgs["id"] = id;
    }

    function OnPopUpEndCallback(s, e) {
        if (!pcModalMode.IsVisible())
            pcModalMode.Show();
    }
</script>

弹出(部分视图)

@Html.DevExpress().GridView(settings =>
{
    settings.Name = "preparedMessagesGrid";

    // other stuff

    settings.ClientSideEvents.SelectionChanged = "OnSelectionChanged";
}).Bind(Model.preparedMessages).GetHtml()

<强>控制器

@Html.DevExpress().PopupControl(settings =>
{
    settings.Name = "pcModalMode";

    // other stuff

    settings.CallbackRouteValues = new { Controller = "Messages", Action = "Load" };
    settings.ClientSideEvents.BeginCallback = "OnPopUpBeginCallback";
    settings.ClientSideEvents.EndCallback = "OnPopUpEndCallback";

    // other stuff
}).GetHtml()

参考文献:

(1)Display GridView Row Details in PopupControl Window

(2)How to display detail data within a popup window (MVC)

(3)ASPxClientGridView.GetSelectedFieldValues(DevExpress文档)

(4)MVCxClientBeginCallbackEventArgs.customArgs(DevExpress文档)