我应该如何配置我的视图以在 MVC 中获取窗口.父值

How should I configure my view for getting window.parent value in MVC?

本文关键字:MVC 获取 父值 窗口 视图 我的 何配置 配置 我应该      更新时间:2023-09-26

我得到了这个 html 表单内容,所以我可以调整我的剃须刀视图以设置我的隐藏值并正确运行,但到目前为止我没有得到任何值设置。在我视图中的 iframe 中,这是我拥有的内容:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ThirdPartyHandler.aspx.vb" Inherits="ThirdPartyHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Welcome</title>    
    <script type="text/javascript" language="JavaScript">
    <!--
        function valuesSet() {
            try
            {
                window.parent.document.MyForm.MyHiddenValue.value = "true";
                window.parent.document.MyForm.submit();
            }
            catch(err)
            {
                //Silently Swallow any Error here as we may not be in a hosted container with a listening form...
            }
        }
    //-->
    </script>
</head>
<body onload = "valuesSet();">
<h1><br /><br />Thank you.</h1>
<input type="hidden" name="MyHiddenFormComplete" value="true" />
</body>
</html> 

因此,这一切都来自跨域的iframe内容,而不是我的应用程序中。

现在在我的剃刀视图中,我正在尝试这样的事情:

 @using (Html.BeginForm(null, null, FormMethod.Post, new { name = "MyForm", id = "MyForm" }))
{
<div class="row">
    <iframe id="frame" src = '@Model.SecureUrl' width = "100%" 
            height="360px" frameBorder="0"></iframe>
    <input type="hidden" name="MyHiddenValue" />
</div>
}

我期望发生的事情是,当 valuesSet() 函数在 iframe 中执行时,我的本地"MyHiddenValue"隐藏字段会将值设置为"True",但这不会发生。我做错了什么?

"所以这一切都来自跨域的iframe内容,而不是我的应用程序中。

那是你的问题。您无法通过客户端代码获取/更改两个不同域之间的任何内容。如果可以的话,这对浏览器来说将是一个非常大的安全问题。

想象一下,我可以在我的网站上拥有指向另一个网站(假设Gmail网站)的任何iframe,我可以在那里操纵东西,以获取有关用户的一些个人信息(假设他已经在该浏览器中登录了他的Google帐户)。

您将无法执行此操作。

不过,有一个解决方法:

  • 您的合作伙伴应该调用您网站的某个服务器端页面,例如:

    function valuesSet() {
        location.href = "http://yoursite.com/?myhiddenvalue=true";
    }
    
  • 您的服务器端页面应执行以下操作:

    <body onload="loaded();">
    <script type="text/javascript">
        function loaded() {
            window.parent.document.MyForm.MyHiddenValue.value = getParameterByName("myhiddenvalue");
            window.parent.document.MyForm.submit();
        }
        function getParameterByName(name) {
            name = name.replace(/['[]/, "''[").replace(/[']]/, "'']");
            var regex = new RegExp("[''?&]" + name + "=([^&#]*)"),
            results = regex.exec(location.search);
            return results == null ? "" : decodeURIComponent(results[1].replace(/'+/g, ""));
        }
    </script>
    

这样做可以避免跨域客户端安全问题。