在我的控制器中,我具有以下功能:
Function AppError() As ActionResult
Dim myScript As Object = "popup(" + Properties.postError + ")"
Return RedirectToAction("main", myScript)
End Function
使用此功能,我想在剃刀页面上调用一个名为popup
且参数为Properties.postError
的Javascript。
我的脚本是:
<script type="text/javascript">
var errMsg;
function popup(msg) {
errMsg = msg;
window.alert(errMsg);
window.window.focus();
if (window.confirm)
errmsg = '';
msg = '';
}
</script>
我需要弹出错误消息。
我通过调试器遵循程序,发现它进入了我的页面。
但是没有错误消息窗口出现。
我已经在网上搜索此选项,但没有成功。
在这个问题上有人可以协助我吗?
添加-19/2/2 19:50
到目前为止,我所做的是:
Function CBError() As ActionResult
Dim myScript As Object = "popup(" + Properties.postError + ")"
ViewData.Add(New KeyValuePair(Of String, Object)("ScriptName", myScript))
Return View("main", myScript)
End Function
我们可以看到,我通过添加ViewData
来更改了功能
我添加了一个值对参数1)名称2)值
加法的动作效果很好,字典也能收到它。
我在我的脚本(位于我的剃刀页面中)中输入了以下内容:
<script type="text/javascript">
var vd = @ViewData.Item(0);
function popup(msg) {
var errMsg;
errMsg = msg;
window.alert(errMsg);
window.window.focus();
if (window.confirm)
errmsg = '';
msg = '';
//{ window.location.href = "/" }
}
</script>
当我在var vd = @ViewData.Item(0);
指令中停止(与调试器一起使用)时,我看到ViewData
完全是空的。没有值就没有。
我还添加了此window.onload = @Html.Raw(ViewBag.MyScript);
在调试器中向我抛出错误
“未捕获到的SyntaxError:意外令牌;”
有人告诉我为什么会这样吗?
添加-19/2/19 20:00
新版本的函数和脚本
Function CBError() As ActionResult
Dim myScript As Object = Properties.postError
ViewData.Add(New KeyValuePair(Of String, Object)("Message", myScript))
Return View("main")
End Function<br/>
<script type="text/javascript">
$(document).ready(function (){
alert("@ViewData.Values(0)");
});
</script>
在此版本中,我将message
的值添加到ViewData
但是,当程序到达script
时,则所有ViwData
都是空的。
没有值,没有键,没有。
似乎在中间某处丢失了所有数据
最终更新19/2/19 11:13
问题已经解决了...但是不是我们穿的方式。
解决方法非常简单。
我们要的是在所进入的页面上获取错误消息。从代码的任何位置开始。
因此,我遵循了将消息呈现给属性的方法,并使用以下Javascript
从页面中读取了此消息。
功能是:
Function CodePage_Error() As ActionResult
Return View("main")
End Function
结束Javascript是:
<script type="text/javascript">
$(document).ready(function () {
if ("@Properties.InnerError" !== "") {
var msg = "@Properties.InnerError";
window.alert(msg);
} else {
return false;
}
});
Javascript放置在mainLayout.vbhtml
文件中
一般而言,事实证明,在MVC4环境中无法实现从控制器到页面的传输方法。
答案 0 :(得分:1)
您可以通过Viewbag将错误消息传递到页面,然后将弹出脚本放入文档就绪的javascript函数中,以检查消息并在需要时显示错误。
控制器:
public IActionResult Index()
{
ViewBag.Message = "this is your message";
return View();
}
查看:
<script type="text/javascript">
$(document).ready(function (){
alert("@ViewBag.Message");
});
答案 1 :(得分:1)
我认为通过RedirectToAction
路由值参数传递JS代码不是一个好主意,因为将对某些特殊字符进行编码。您应该使用ViewBag
或viewmodel属性,并传递脚本以未编码状态进行查看。
这是示例设置:
1)使用ViewBag
或viewmodel属性包含要在视图中执行的脚本。
Public Function AppError() As ActionResult
' define Properties.postError here
Dim myScript As String = "popup(" + Properties.postError + ")"
ViewBag.MyScript = myScript
Return View()
End Function
2)使用事件处理程序,例如window.onload
从@Html.Raw()
或视图模型属性中分配了ViewBag
,以在<script>
标签内传递未编码的函数调用。事件处理必须放在function
块的外部。
<script type="text/javascript">
var errMsg;
function popup(msg) {
errMsg = msg;
window.alert(errMsg);
window.window.focus();
if (window.confirm)
errmsg = '';
msg = '';
}
// the popup will be called here
window.onload = @Html.Raw(ViewBag.MyScript)
</script>
请注意,window.onload
将在加载视图后弹出消息,如果要在另一个事件中弹出消息,请改用任何所需的event handler(也请选中list of available JS DOM events)