给定 HttpContext.Handler,如何在 MVC3 中启动时注册脚本

本文关键字:启动 注册 脚本 MVC3 Handler HttpContext 给定 | 更新日期: 2023-09-27 18:24:19

我有一个页面打开了一个带有外部URL(Twitter身份验证URL(的新窗口,现在该窗口将对用户进行身份验证并回调到操作方法,在该操作方法中,我必须关闭当前窗口(弹出窗口(并通知打开器身份验证成功,

在 Web 表单中,我曾经在 (回发(上做过这样的事情:

            (HttpContext.Current.Handler as System.Web.UI.Page).ClientScript.RegisterStartupScript(
            this.GetType(),
            "winPop",
            "window.opener.doSomething(true);window.close()",
            true);

在 MVC 中,我尝试了这个但没有工作,因为没有电流,但有:

HttpContext.CurrentHandler

可以投射到Mvc.MvcHandler现在出现了我知道MVC完全不同,但是有没有办法注册将在响应启动时运行的脚本?

我知道我可以制作一个额外的视图并在新窗口中打开它,然后重定向到 Twitter Url,然后在回调到同一窗口时,我会简单地调用脚本 window.opener......等等,但这意味着我必须制作一个额外的视图,在启动时只有一行 JavaScript,所以我想知道我是否可以执行以下操作之一:

选项 1:注册启动脚本,就像我上面解释的那样。选项 2:返回在客户端运行的 JavaScript 代码(无实际视图(。

给定 HttpContext.Handler,如何在 MVC3 中启动时注册脚本

说明

这在 MVC 中不存在,但您可以使用ViewModelViewBag

样本

_Layout.cshtml

....
<head>
<title>@ViewBag.Title</title>
@if (ViewBag.StartScript != null)
{
    <script>
        @Html.Raw(ViewBag.StartScript);
    </script>
}
....

您的操作方法

public ActionResult Index()
{
    ViewBag.StartScript = "alert('Hello World')";
    return View();
}

你可以简单地忘记你在做什么经典的WebForms,因为它对 ASP.NET MVC没有多大帮助。

在MVC ASP.NET,您有模型,控制器和视图(顾名思义(。因此,如果您想在视图中调用 javascript 函数并从您的模型中向其传递一些值,您可以执行以下操作:

@model MyViewModel
<script type="text/javascript">
    alert(@Html.Raw(Json.Encode(Model.SomeValue)));
</script>

显然,您的控制器操作将填充此模型并将其传递给视图:

public ActionResult Foo()
{
    var model = new MyViewModel
    {
        SomeValue = "Hello world"
    };
    return View(model);
}

当然还有相应的模型:

public class MyViewModel
{
    public string SomeValue { get; set; }
}

看?模型、视图、控制器。


更新:

在该操作方法中,我必须关闭当前窗口(弹出窗口(并 通知开瓶器身份验证成功,

在这个简单的情况下,您不需要模型:

public ActionResult CallbackAction()
{
    return View();
}

和内部CallbackAction.cshtml

<script type="text/javascript">
    window.opener.doSomething(true);
    window.close();
</script>