我正在使用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'
);
}
})
答案 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
属性中传递它。