PartialView用于显示基于ViewBag的模态错误消息

时间:2017-03-01 02:46:16

标签: javascript c# jquery asp.net-mvc razor

我正在使用SweetAlert 2 plugin开发一个MVC 5应用。

我的目标:当我的应用程序中的任何地方发生错误时,我想显示带有标题/消息的(集中式,sweetalert)模式对话框。

我创建了一个名为“_ModalError”的PartialView,并在我的主要共享“_Layout”视图的底部引用了它。基本上这样就可以为每个页面启用这个局部视图。

然后我创建了一个简单的Error类......

namespace MyApp.Models
{
    public class MyError
    {
        public string ErrorTitle { get; set; }
        public string ErrorMessage { get; set; }
    }
}

我在想,每当我收到错误时,我都会实例化一个新的MyError对象,设置相应的ErrorTitle和ErrorMessage属性,然后将ViewBag.Error设置为此MyError对象。

private MyError err = new MyError();
err.ErrorMessage = "Your information was not valid. Please re-check everything.";
err.ErrorTitle = "Error!";
ViewBag.Error = err;

然后,在javascript中,每当_ModalError(页面)加载时,它都会查看是否存在ViewBag.Error。如果是,则发生错误,因此显示它。这是我到目前为止所拥有的......

<script>
    $(function() {
        if (@ViewBag.Error != null) {
            swal(
                @ViewBag.Error.ErrorTitle, 
                @ViewBag.Error.ErrorMessage,
                'error'
            );
    };
</script>

问题是当页面第一次加载时,我遇到这个错误,当它到达视包代码时......

Cannot perform runtime binding on a null reference.

我正在尝试访问ViewBag,但显然它一开始并不存在,这是有道理的。但是,检查它是否为空并不是真的有效。你知道为什么吗?有什么建议?这是一个错误,疯狂或过度杀戮的解决方案吗?

********解决方案********

这是解决方案。感谢Stephen Muecke(下文)提供的Json.Encode建议!我希望这对其他人有帮助!

<script>
$(function() {
    var error = @Html.Raw(Json.Encode(ViewBag.Error));
    if (error != null) {
        swal(
            error.ErrorTitle,
            error.ErrorMessage,
            'error'
        );
    }
})

1 个答案:

答案 0 :(得分:2)

问题是剃刀代码在发送到视图之前在服务器上进行了解析,因此在服务器上评估@ViewBag.Error.ErrorTitle,@ViewBag.Error.ErrorMessage,如果@ViewBag.Error是{{1}抛出异常是因为您无法访问null对象的属性。 (它不会因为它在javascript null语句中而停止评估它 - 这是客户端代码,在那时甚至不存在)

相反,将if对象分配给javascript对象,然后在Error

中对其进行测试
if

您还应该考虑使用包含$(function() { // Assign to a javascript variable var error = @Html.Raw(Json.Encode(ViewBag.Error)) if (!error) { swal( error.ErrorTitle, error.ErrorMessage, 'error' ); } } 对象的基本视图模型,而不是在Error属性中传递它。