Получить возвращаемое значение JS в событии page_load на стороне сервера в asp.net - PullRequest
0 голосов
/ 08 марта 2011

У меня есть сценарий aspx master / content page.Родительская страница имеет IFrame, который указывает на child.aspx.У child.aspx есть флажок. На page_load of child.aspx я хочу показать / скрыть флажок в зависимости от следующей логики: - если child.aspx открывается напрямую, то я должен показать флажок.- если child.aspx открыт в IFrame, то я должен скрыть флажок.По сути, я хочу проверить в child.aspx, если он содержит родительское окно, то скрыть флажок, в противном случае покажите его.

Я предпочитаю показывать / скрывать код в codebehind в событии Page_load, поскольку я должен выполнитьнемного больше логики в зависимости от того, открыт он из родительского окна или нет.

До сих пор я делал следующее: В child.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">

    <script language="javascript" type="text/javascript">
    function DoesParentExists()
    {
        var bool = (parent.location == window.location)? false : true;
        var HClientID ='<%=hfDoesParentExist.ClientID%>'; 
        document.getElementById(HClientID).Value = bool;
    }        
    </script>
    <div>        
        <h2>Content - In IFrame</h2>
        <asp:HiddenField runat="server" id="hfDoesParentExist" />
        <asp:CheckBox ID="chkValid" runat="server" />
        <asp:ImageButton ID="ImageButton_FillW8Online" ImageUrl="~/images/expand.gif"
        OnClick="btnVerify_Click" runat="server" style="height: 11px" />    
    </div>
</asp:Content>

в client.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "DoesParentExists", "DoesParentExists()", true);
    if (hfDoesParentExist.Value == "true")
    {
        chkValid.Visible = false;
    }
}

Используя RegisterClientScriptBlock, я получаю сообщение об ошибке в JS.То, что объект hfDoesParentExist не существует, поскольку элемент управления еще не создан.Правильно?Я пытался использовать RegisterStartupScript, но в codebehind я всегда получаю ноль в скрытой переменной.Я не хочу использовать нажатие кнопки или что-то подобное.Мне нужно только на событие page_load.Как решить проблему?

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Эта строка:

document.getElementById(HClientID).Value = bool;

Должно быть: (нижний регистр value)

document.getElementById(HClientID).value = bool;

Также вы не можете проверить значение скрытого поля, установленного обратным вызовом регистра javascript, в текущем контексте выполнения на стороне сервера.

Я бы переместил логику на сторону клиента, чтобы скрыть или показать флажок. Если поле действительно необходимо удалить со страницы, вы можете сделать это также с помощью JavaScript.

function DoesParentExists()
{
    var bool = (parent.location == window.location)? false : true;
    var cehckboxId ='<%=chkValid.ClientID%>'; 
    if(bool){ 
        document.getElementById(cehckboxId).style.display = 'none';
    }
    else {
        document.getElementById(cehckboxId).style.display = 'block';
    }
}    

Возможно, вы захотите обернуть флажок элементом div и скрыть контейнер, чтобы также включить метку.

0 голосов
/ 08 марта 2011

Чтобы сделать это на стороне сервера, я бы использовал параметр строки запроса. Попросите родительскую страницу загрузить дочернюю страницу, добавив ?inframe=1. Затем проверьте это значение в вашем Page_Load.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...