1

我在调用 Web 服务并将 Json 结果返回到视图的 asp.net mvc Web 应用程序中有以下操作方法:-

public ActionResult ListPackages()
{
    using (var client = new WebClient())
    {
        try{
            var query = HttpUtility.ParseQueryString(string.Empty);
            UriBuilder("http://localhost:8080/jw/web/json/workflow/package/list");
            url.Query = query.ToString();
            string json = client.DownloadString(url.ToString());
            Thread.Sleep(500);
            return Content(json, "application/json");
        }
        catch (System.Net.WebException ex) {
            return Content("Error, service is down. please try again later", "application/json");
        }
    }
}

然后在视图上我定义了以下 Ajax.Actionlink:-

@Ajax.ActionLink("Get Process List", "ListPackages", "Home",
new AjaxOptions
{
    HttpMethod = "GET",
    LoadingElementId = "tobehide",
    OnSuccess = "getpackagelist"
})

和以下 getpackagelist java 脚本:-

function getpackagelist(result) {
    $('#products').empty();
    $('#title').text("All Processes");
    $.each(result.data, function (key, val) {
        var str = val.packageName;
        $('<li/>', { text: str }).appendTo($('#products'));
    });
    $('#tobehide').hide();

}

我面临的问题是,如果 Web 服务关闭并且System.Net.WebException引发异常,则" Error, service is down. please try again later "maeeage 将不会显示在视图中,并且在 ajax 加载图像后不会显示任何内容......

:::编辑:::

我将脚本修改为:-

function getpackagelist(result) {

    if (result.error == null) {
        $('#products').empty();
        $('#title').text("All Processes");
        $.each(result.data, function (key, val) {
            var str = val.packageName;
            $('<li/>', { text: str })
                .appendTo($('#products'));
        });
        $('#tobehide').hide();
    }
    else {
        $('<li/>', { text: result.error })
                       .appendTo($('#products'));
    }

动作方法如下:-

catch (System.Net.WebException) {

                    return new JsonResult()
                    {
                        Data = new { error = "Error, service is down. please try again later" }
                    };

但如果引发 WebExsception,仍然不会显示错误。BR

4

1 回答 1

2

编辑

正如 john G 纠正我的那样,当然OnFailure不会在这里调用,因为异常被控制器捕获。因此,要返回有效的 JSON 结果,请使用以下命令:

return new JsonResult() { 
    Data = new { error = "Error, service is down. please try again later" }
};

这只是创建了一个匿名类型(以及JsonResult)作为返回任意 JSON 的简单方法。然后在OnSuccess脚本中,检查error属性:

function getpackagelist(result) {
    if (result.error) {
        // display error ...
    } else {
        // success ...
    }
}

使用 的OnFailure属性AjaxOptions来处理错误场景。

new AjaxOptions
{
    // ...
    OnFailure = "packagelisterror"
}

请注意,该函数将传回一个包含responseText属性的 JSON 对象。因此,您可以使用以下内容显示错误消息:

function packagelisterror(e) {
    $("#products").html(e.responseText);
}
于 2012-10-21T09:00:54.227 回答