如何在javascript中捕获.NET异常?

时间:2013-10-31 10:29:58

标签: javascript asp.net-mvc-3 razor

我正在使用ASP C#.NET MVC3构建一个webapp。

我有一个视图( .cshtml文件)。在这个视图中,我有一个javascript函数“SomeFunction()”,它通过 Razor 调用.NET函数,如下所示:“@ Html.Raw(Json.Encode(Model))”。所以把它们放在一起看起来像是:

SomeFunction(){
    var sections = @Html.Raw(Json.Encode(Model));
}

请注意@ please。

当字符串的大小超过最大值(基本上太多的部分)时,此函数抛出异常(这个例外是准确的:Increase json response maxJsonLength in MVC 4)。 那么我的网站的要求并没有指示我实际处理这个(幸运的是)通过检索异步和诸如此类的数据。 我很幸运能够捕获这个异常并告诉用户:“太多的部分!请为部分定义更大的尺寸。”或类似的东西。 唉,我真的不明白怎么做到这一点。我尝试了以下内容:

SomeFunction(){
    try {
        var sections = @{try {
            Html.Raw(Json.Encode(Model));
        } catch (Exception e) {
            throw new Exception("Exception caught in .NET");
        }}
    } catch(err) {
        alert('.NET exception caught in Javascript!');
    }
}

注意'尝试'的@front表示Razor语法。

永远不会达到javascript中catch子句中的'alert'。我来自桌面开发,所以我还是网络新手。这通常是怎么做的?

非常感谢您提前帮助我。

5 个答案:

答案 0 :(得分:3)

从技术上讲,你不能。

因为这些是在不同环境中运行的两种不同语言(一种在服务器上,另一种在客户端上),最好的办法是在ASP.NET应用程序中捕获异常,然后将异常返回给客户端格式化为字符串以及关于执行是否成功的一些指示。

简单的例子就是这个ajax请求/响应:

我们的自定义回复对象:

public class JsonResponse
{
    public bool Success { get; set; }
    public string Message { get; set; }
}

<强>用法:

[HttpPost]
public JsonResult DeleteMember(int id)
{
    try {
        this.memberService.DeleteMember(id);
    }
    catch (Exception ex)
    {
        return Json(new JsonResponse { Success = false, Message = ex.ToString());
    }
    return Json(new JsonResponse { Success = true });
}

然后你的客户端Javascript会将对象返回给它,在那里你将能够看到请求是否成功,如果没有,那么异常/错误消息是什么。

<script type="text/javascript">

$(function() {
    $.post('@Html.Action("Member", "DeleteMember")', function(response) {
        if (response.Success == false) {
            alert(response.Message);
        } else {
            alert("Member was deleted!");
        }
    });
});

</script>

答案 1 :(得分:1)

你在这里混合了两件事。 Javascript在客户端执行,c#代码驻留在服务器端并抛出异常。

所以这里基本上发生的是当渲染这个视图时。此代码已执行

@try{
            Html.Raw(Json.Encode(Model));
        } catch (Exception e) {
            throw new Exception("Exception caught in .NET");
        }
    } catch(err) {
        alert('.NET exception caught in Javascript!');
    }

最后发送给客户端的是Html.Raw(Json.Encode(Model))的输出,而@的输出又不产生任何结果。因为你没有包含SomeFunction(){ var sections = "@Html.Raw(Json.Encode(Model))"; if(sections.length > [MAX LENGTH]){alert(SOMETHING);} else{ sections = JSON.parse(sections); //your old code here } } 前缀。

相反,您可以做的是检查客户端本身的字符串长度

{{1}}

答案 2 :(得分:1)

如果你是通过Razor创建你的javascript函数(听起来有些奇怪!)你应该决定如何管理异常,服务器端或客户端。下面的代码是一个异常管理,它将发生在我认为适合你的服务器端:

SomeFunction(){
    string sections; 
    @try {
        sections = Html.Raw(Json.Encode(Model));
    } 
    catch (Exception e) {
        sections = "Error";
    }

    if (sections == "Error")
    {
        alert("Your message");
    }
}

答案 3 :(得分:0)

你可以试试这个

SomeFunction(){
    var sections = @{try {
        Html.Raw(Json.Encode(Model));
    } catch (Exception e) {
        Html.Raw(false)
    }}
    if(!!sections){
        alert('.NET exception caught in Javascript!');
    }
}

答案 4 :(得分:0)

Big Joe,Parv Sharma和mehrandvd都有一点意见。我现在意识到了。再次感谢您的贡献。我很抱歉我没有立即理解你的答案。

然而,在我的情况下,没有一个是完全有用的。 Atleast ...我试过Big Joe's并且无法像我想的那样工作(因为Post导致重新加载我不需要的页面)。

我做的是:

在控制器的动作中,我的模型(部分集合)被填充,我现在已经尝试将集合序列化为Json(这是服务器端)。这看起来像:

            List<Models.Section> sections = Models.Section.GetSectionsByCampaignID(campaignID);

            try {
                string sectionsAsJson = System.Web.Helpers.Json.Encode(sections);
            } catch (Exception) {
                sections = null;
            }

现在,我在View中的javascript中所做的就是检查null,如下所示:

    var sections = @Html.Raw(Json.Encode(Model));

    if(sections != null){
        //Some code to do stuff with the sections.
   }  else {
        alert('Sorry for the inconvenience, but there are too much sections to draw. This is causing a technical error. Please edit the map and define a bigger section size.');
    }

所以是的,也许不是经验丰富的网络开发者如何解决它。但它对我有用。是否有经验丰富的Web开发人员预见到任何重大问题?请评论。我随时准备了解更多信息。