0

Ajax削除コマンドを使用したASP.NETMVC用の単純なTelerikグリッドがあります。削除は機能しますが、ページにエラーが表示され、更新されません。

また、AJAX呼び出しの戻り時にカスタムJavaScriptを呼び出したいのですが、コードをどこに配置するかがわかりません。

ビューは次のとおりです。

Html.Telerik()
    .Grid<ScenarioVm>(Model)
    .Name("scenarioGrid")
    .DataBinding(dataBinding => dataBinding
        .Ajax()
        .Delete("Delete", "Scenario")
        .Select("Index", "Scenario"))
    .DataKeys(keys => keys.Add(c => c.Id))
    .Columns(columns =>
    {
        columns.Template(o => o.Name)
            .Title("Scenario")
            .FooterTemplate(@<text>Total @Model.Count()</text>);
        columns.Bound(o => o.IsLocked);
        columns.Bound(o => o.ContractMonth);
        columns.Bound(o => o.CreateDate);
        columns.Command(commands => commands
                .Delete()
                .ButtonType(GridButtonType.Image))
            .Title("Delete");
    })
    .Sortable()
    .Scrollable(scroll => scroll.Height(200))
    .ClientEvents(events => events.OnDelete("onDelete")))

AJAX呼び出しの前に呼び出されるJavascript:

function onDelete(e) {
    var scenario = e.dataItem;
    if (scenario.CanDelete == false) {
        alert("Can not delete " +
            e.dataItem.Name +
            ": there exists a solution!");
        return false;
    } else {
        $.blockUI({
            css: {
                border: 'none',
                padding: '15px',
                backgroundColor: '#000',
                '-webkit-border-radius': '10px',
                '-moz-border-radius': '10px',
                opacity: .5,
                color: '#fff'
            }
        });
        return true;
    }
}

コントローラ方式:

[HttpPost]
[GridAction]
public ActionResult Delete(Scenario scenario)
{
    Logger.Info("Delete scenario " + scenario);
    if (scenario == null)
    {
        return new EmptyResult();
    }

    try
    {
        _scenarioRepository.Delete(scenario);
        Logger.Info("Successfully deleted " + scenario);
    }
    catch(Exception e)
    {
        Logger.Error(scenario + e.Message, e);
        var result = new JsonResult
        {
            JsonRequestBehavior = JsonRequestBehavior.DenyGet,
            Data = new {
                ErrorCode = 1,
                ErrorMessage = e.GetType() + ": " + e.Message
            }
        };

        return result;
    }

    return new EmptyResult();
}
4

2 に答える 2

1

質問を正しく理解していれば、操作が完了したときにjavascript関数を実行したいと思います。サンプルソースコードの最後の行は、OnCompleteイベントのコールバックを定義することです。

.ClientEvents(events => events
            .OnLoad("onLoad")
            .OnEdit("onEdit")
            .OnDetailViewCollapse("onDetailViewCollapse")
            .OnDetailViewExpand("onDetailViewExpand")
            .OnDelete("onDelete")
            .OnSave("onSave")
            .OnDataBinding("onDataBinding")
            .OnRowDataBound("onRowDataBound")
            .OnRowSelect("onRowSelect")
            .OnDataBound("onDataBound")
            .OnColumnResize("onColumnResize")
            .OnColumnReorder("onColumnReorder")
            .OnComplete("onComplete"))

Telerikのドキュメントには、OnCompleteイベントを定義する方法の例もあります。

于 2012-07-26T13:08:31.497 に答える
1

上記のコードにはいくつか間違っている点があります。まず、リクエストがサーバーに送信されるに、クライアント イベントOnDeleteがクライアントでトリガーされます。サーバーへの Ajax 呼び出しの結果が必要な場合は、イベントを処理する必要があります。このイベントは、サーバーの Ajax 呼び出しが完了し、結果がクライアントに返された後に発生します。OnComplete

次に、GridAction アクション フィルターは、型の値をIGridActionビューに返すことを想定しています。期待値を返していないため、クライアントでエラーが発生します。Controller メソッドがどのように見えるかの例を次に示します。

[HttpPost]
[GridAction]
public ActionResult Delete(Scenario scenario)
{
    // Delete item and perform other operations as required
    var data = ... // Get an updated data set, with the deleted item removed
    var model = new GridModel<ScenarioVm>(data);
    return View(model);
}

Telerik のサイトで、Ajax バインディングについて詳しく説明している記事があります。

それが役立つことを願っています。

于 2012-07-25T22:47:48.727 に答える