Javascript 基于ViewBag显示模式错误消息的PartialView
我正在用开发一个Javascript 基于ViewBag显示模式错误消息的PartialView,javascript,c#,jquery,asp.net-mvc,razor,Javascript,C#,Jquery,Asp.net Mvc,Razor,我正在用开发一个MVC5应用程序 我的目标:当我的应用程序中的任何地方发生错误时,我希望显示一个带有标题/消息的(集中式、sweetalert)模式对话框 我创建了一个名为“_ModalError”的PartialView,并在我的主共享“_布局”视图的底部引用了它。基本上,每个页面都将启用此部分视图 然后我创建了一个简单的错误类 namespace MyApp.Models { public class MyError { public string Error
MVC5
应用程序
我的目标:当我的应用程序中的任何地方发生错误时,我希望显示一个带有标题/消息的(集中式、sweetalert)模式对话框
我创建了一个名为“_ModalError”的PartialView,并在我的主共享“_布局”视图的底部引用了它。基本上,每个页面都将启用此部分视图
然后我创建了一个简单的错误类
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>
我试图访问ViewBag
,但很明显,它一开始并不存在,这是有道理的。但是,检查它是否为null并没有真正起作用。你知道这是为什么吗?有什么建议吗?这是一个错误的、疯狂的或过度杀戮的解决方案吗
********解决方案********
这是解决办法。感谢Stephen Muecke(以下)提供的Json.Encode建议!我希望这对其他人有帮助
<script>
$(function() {
var error = @Html.Raw(Json.Encode(ViewBag.Error));
if (error != null) {
swal(
error.ErrorTitle,
error.ErrorMessage,
'error'
);
}
})
$(函数(){
var error=@Html.Raw(Json.Encode(ViewBag.error));
if(错误!=null){
游泳(
error.ErrorTitle,
error.ErrorMessage,
“错误”
);
}
})
问题在于,razor代码在发送到视图之前在服务器上进行解析,因此
@ViewBag.Error.ErrorTitle、
和@ViewBag.Error.ErrorMessage
在服务器上进行评估,如果@ViewBag.Error
为空值
,则,抛出异常是因为您无法访问null
对象的属性。(它不会仅仅因为它在javascriptif
语句中就停止对其求值——这是客户端代码,在该点上甚至不存在)
相反,将Error
对象分配给javascript对象,然后在if
块中测试它
$(function() {
// Assign to a javascript variable
var error = @Html.Raw(Json.Encode(ViewBag.Error))
if (!error) {
swal(
error.ErrorTitle,
error.ErrorMessage,
'error'
);
}
}
您还应该考虑使用包含< <代码>错误>代码>对象的基本视图模型,而不是在<代码> ViewBag < /代码>属性中传递。
您需要包装<代码> @ ViepBog。错误。ErrorTitle < /COD>和“代码> @ ViekP袋。错误。Error消息< /代码>中,他首先需要确定<代码> ViewBag < /代码>是否有<代码>错误< /代码>。属性。@Igor。这正是如果(!error){
所做的:)嗯,好的。我的印象是,访问动态对象的不存在属性是不允许的。@Igor,它不是访问动态对象的不存在属性。第一行代码的计算结果为null
(如果ViewBag.error
未分配)或者发送到{ErrorTitle:'Error!',ErrorMessage:'Your information was…'}
,如果有的话。然后是访问属性值的javascript(而不是razor)@StephenMuecke perfect!谢谢!
$(function() {
// Assign to a javascript variable
var error = @Html.Raw(Json.Encode(ViewBag.Error))
if (!error) {
swal(
error.ErrorTitle,
error.ErrorMessage,
'error'
);
}
}