Получить возвращаемое значение JS в событии page_load на стороне сервера в asp.net
У меня есть сценарий 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 ответа
Эта строка:
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 и скрыть контейнер, чтобы также включить метку.
Чтобы сделать это на стороне сервера, я бы положился на параметр строки запроса. Пусть родительская страница загрузит дочернюю страницу, добавив ?inframe=1
, Затем проверьте это значение в вашем Page_Load
,