javascript - 从 MVC4 中的控制器调用我的剃须刀页面中的 Javascript
问题描述
在我的控制器中,我有这个功能:
Function AppError() As ActionResult
Dim myScript As Object = "popup(" + Properties.postError + ")"
Return RedirectToAction("main", myScript)
End Function
使用此函数,我想调用我的剃须刀页面,其中有一个名为 Javascriptpopup
的参数Properties.postError
。
我的脚本是:
<script type="text/javascript">
var errMsg;
function popup(msg) {
errMsg = msg;
window.alert(errMsg);
window.window.focus();
if (window.confirm)
errmsg = '';
msg = '';
}
</script>
我需要的是弹出错误消息。
我通过调试器跟踪程序,我看到它进入了我的页面。
但是没有错误消息窗口出现。
我已经在网上搜索了这个选项,但没有任何成功。
有人在这个问题上帮助我吗?
补充 - 16/2/19 12: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
添加 I 添加值对参数来更改函数 1) 名称 2) 值
添加的操作可以正常工作,并且字典会接收到它。
我的脚本(在我的 reazor 页面中)我输入了以下内容:
<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>
当我在指令中停止(与 bebugger 一起)时,var vd = @ViewData.Item(0);
我看到它ViewData
完全是空的。没有价值观,什么都没有。
我还添加了这个window.onload = @Html.Raw(ViewBag.MyScript);
并且在调试器中给我一个错误
“未捕获的语法错误:意外的令牌;”
有没有人告诉我为什么会这样?
添加 - 16/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
都是空的。
没有值没有键什么都没有。
它似乎在中间的某个地方丢失了所有数据
最终更新 17/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环境下是不行的
解决方案
我认为通过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()
fromViewBag
或 viewmodel 属性来传递 <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
加载视图后会弹出消息,如果您想在另一个事件中弹出消息,请改用任何所需的事件处理程序(同时检查可用 JS DOM 事件列表)。