繁体   English   中英

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

[英]How to catch a .NET exception in javascript?

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

我有一个视图( .cshtml文件 )。 在此视图中,我有一个JavaScript函数“ SomeFunction()”,该函数通过Razor调用.NET函数,例如:“ @ Html.Raw(Json.Encode(Model))”。 因此,所有内容汇总如下:

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

请注意@。

当字符串的大小超过最大值时(基本上是太多部分),此函数将引发异常(确切地说是此异常: 增加MVC 4中的json响应maxJsonLength )。 好吧,我网站的要求并没有指示我实际(幸运地)通过异步地提取数据来解决这个问题。 我很幸运,可以简单地捕获此异常并告诉用户:“节太多!请为节定义更大的尺寸。” 或类似的东西。 las,我真的不太了解该怎么做。 我尝试了以下方法:

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!');
    }
}

注意“ try”的@ infront表示Razor语法。

永远不会到达javascript中catch子句中的“警报”。 我来自台式机开发人员,所以我仍然是Web新手。 通常如何做?

在此先非常感谢您的帮助。

从技术上讲,您不能。

因为这是在不同的环境中运行的两种不同的语言(一种在服务器上,另一种在客户端上),所以最好的办法是在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>

您在这里混合两件事。 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))的输出,该输出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
     }
}

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

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

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

你可以试试这个

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

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开发人员无法解决该问题。 但这对我有用。 是否有经验丰富的Web开发人员预见到与此相关的任何重大问题? 请评论。 我随时准备学习更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM