首页 > 解决方案 > 从 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环境下是不行的

标签: javascriptasp.net-mvcvb.net

解决方案


我认为通过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 事件列表)。


推荐阅读