0

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

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

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

请注意@。

当字符串的大小超过最大值(基本上是太多部分)时,此函数会引发异常(确切地说是此异常: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!');
    }
}

注意 'try' 前面的 @ 表示 Razor 语法。

永远不会达到 javascript 中的 catch 子句中的“警报”。我来自桌面开发,所以我仍然是网络新手。这通常是如何完成的?

非常感谢您提前帮助我。

4

5 回答 5

4

从技术上讲,你不能。

因为这是在不同环境中运行的两种不同语言(一种在服务器上,另一种在客户端上),所以最好的办法是在 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>
于 2013-10-31T11:24:59.277 回答
1

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

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

    if (sections == "Error")
    {
        alert("Your message");
    }
}
于 2013-10-31T10:44:54.940 回答
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
     }
}
于 2013-10-31T10:32:41.223 回答
0

你可以试试这个

SomeFunction(){
    var sections = @{try {
        Html.Raw(Json.Encode(Model));
    } catch (Exception e) {
        Html.Raw(false)
    }}
    if(!!sections){
        alert('.NET exception caught in Javascript!');
    }
}
于 2013-11-01T09:12:56.173 回答
0

Big Joe、Parv Sharma 和 mehrandvd 都有自己的观点。我现在意识到了。再次感谢您的贡献。很抱歉,我没有立即理解您的回答。

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

我所做的是:

在我的模型(部分的集合)被填充的控制器的操作中,我现在已经尝试将集合序列化为 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 开发人员预见到这方面的任何重大问题?请评论。我随时准备学习更多。

于 2013-11-01T09:15:56.397 回答