从MVC4中的控制器在我的剃须刀页面中调用Javascript

时间:2019-02-15 12:03:46

标签: javascript asp.net-mvc vb.net

在我的控制器中,我具有以下功能:

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环境中无法实现从控制器到页面的传输方法。

2 个答案:

答案 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

相关问题