window.parent.location.href не работает с ajaxcontroltoolkit в asp.net

Я использую iframe для открытия новой страницы .aspx с родительской страницы. дочерняя страница использует ajaxcontroltoolkit (ajax CalendarExtender). Теперь при отправке формы я хочу закрыть iframe и вернуться на родительскую страницу. Для этого я использую следующий код.

ClientScript.RegisterStartupScript(this.GetType(), "scriptid", window.parent.location.href='ViewVendors.aspx'", true);

Этот файл работает, если я удаляю элемент управления ajax с дочерней страницы, но не работает с элементом управления ajax. Я хочу использовать и calenderExtender, и iframe. Как я могу его использовать и в чем проблема такого так называемого ненормального поведения.

Это код моего обработчика событий кнопки отправки.

protected void btnUpdate_Click(object sender, EventArgs e)
{
    try
    {
        objVendor.VendorID = Convert.ToInt64(Request.QueryString["Id"]);
        objVendor.Name = txtName.Text;
        objVendor.BillingAddress = txtBillingAddress.Text;
        objVendor.ShippingAddress = txtShippingAddress.Text;
        objVendor.ContactPersonName = txtContactPerson.Text;
        objVendor.ContactNumber = txtContactNumber.Text;
        objVendor.EmailID = txtEmailID.Text;
        objVendor.VendorSinceDate = Convert.ToDateTime(txtVendorDate.Text);
        objVendor.IsActive = Convert.ToBoolean(rdblStatus.SelectedValue);
        objVendor.Logo = FileUpload();
        int intResult = objVendor.UpdateVendor();
        if (intResult > 0)
        {
            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "window.parent.location.href='ViewVendors.aspx'", "scriptid", true);
            //ClientScript.RegisterStartupScript(this.GetType(), "scriptid", "window.parent.location.href='ViewVendors.aspx'", true);
        }
    }
    catch (Exception ex)
    {
        lblMessage.Text = ex.Message;
        lblMessage.CssClass = "ERROR";
    }
}

//Редактировать Теперь мой код работает нормально, пока я не добавляю расширитель календаря на дочернюю страницу. Когда я добавляю расширитель календаря на дочернюю страницу, появляется ошибка «Коллекция элементов управления не может быть изменена, поскольку элемент управления содержит блоки кода (т. е. ‹% ... %>)». Если я удаляю удлинитель календаря, снова все работает хорошо. Погуглив, я обнаружил, что ‹% %> в теге Javascript создает проблему. Как я могу решить эту проблему и почему контроль календаря создает проблемы в таких случаях?

Вот код моего скрипта.

<script type="text/javascript">
    function uploadStarted() {
        $get("imgDisplay").style.display = "none";
    }
    function uploadComplete(sender, args) {
        var imgDisplay = $get("imgDisplay");
        //  var imgPhoto = $get("#imgPhoto");
        var imgPhoto = document.getElementById('<%=imgPhoto.ClientID %>');
        imgDisplay.src = "images/loader.gif";
        imgPhoto.style.display = "none";
        imgDisplay.style.cssText = "";
        var img = new Image();
        img.onload = function () {
            imgDisplay.style.cssText = "height:100px;width:100px";
            imgDisplay.src = img.src;
        };
        img.src = "<%=ResolveUrl(UploadFolderPath) %>" + args.get_fileName();

    }
</script>

person Microsoft Developer    schedule 26.06.2012    source источник


Ответы (1)


Вам необходимо зарегистрировать свой JavaScript с помощью ScriptManager. экземпляр на вашей странице, который у вас уже должен быть, если вы используете AJAX. Он имеет собственный метод RegisterStartupScript, который вы можете использовать.

person Mark M    schedule 26.06.2012
comment
Экземпляр диспетчера сценариев не показывает метод RegisterStartupScript. Не могли бы вы объяснить подробно на примере? Вот экземпляр scriptmanatger ‹asp:ScriptManager ID=manager1 runat=server› ‹/asp:ScriptManager› - person Microsoft Developer; 26.06.2012
comment
Это статический метод, так что вы бы назвали его в таком коде: System.Web.UI.ScriptManager.RegisterStartupScript(...) - person Mark M; 26.06.2012
comment
.. Я написал так ScriptManager.RegisterStartupScript(this.Page, this.GetType(), window.parent.location.href='ViewVendors.aspx, scriptid, true); Все еще не работает. Я хочу перенаправить на страницу ViewVendors.aspx, которая является родительской страницей. Что не так в моем коде? - person Microsoft Developer; 26.06.2012
comment
Вы переставили аргументы ключа и скрипта и забыли одинарную кавычку после ViewVendors.aspx. Должно быть: ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "scriptid", "window.parent.location.href='ViewVendors.aspx'", true); - person Mark M; 26.06.2012
comment
Я сделал то же самое, но все еще не работает. Я пропустил какой-либо параметр или они неуместны? - person Microsoft Developer; 26.06.2012
comment
Что вы имеете в виду под не работает? Если вы просматриваете исходный код, видите ли вы JavaScript, который пытаетесь вставить? Вы видите ошибку 404 или какой-то признак того, что он пытается перейти не на ту страницу? Вы видите какие-либо ошибки JavaScript? - person Mark M; 26.06.2012
comment
Я не вижу никакой ошибки. Страница остается такой же, как и после отправки формы. Javascript не отображается в исходном коде страницы. - person Microsoft Developer; 26.06.2012
comment
Просто для ясности: источник страницы, на который вы смотрели, был источником iframe, а не родительской страницей, верно? Ваша кнопка отправки находится в iframe, а обработчик кнопки отправки — это то место, откуда вы пытаетесь внедрить JavaScript, верно? - person Mark M; 26.06.2012
comment
Я видел исходники обеих страниц. Ни на одной странице javascript не виден. Да, кнопка «Отправить» находится в iframe (на дочерней странице), и я пытаюсь внедрить javascript в событие нажатия кнопки. - person Microsoft Developer; 26.06.2012
comment
Вы уверены, что ваш ключ scriptid уникален? Можете ли вы опубликовать код обработчика событий кнопки в качестве редактирования вашего вопроса? - person Mark M; 26.06.2012
comment
Я отредактировал свой вопрос с кодом. Я понятия не имею, что такое scriptid. - person Microsoft Developer; 26.06.2012
comment
scriptid — это то, что вы ввели в качестве значения ключа в вызове RegisterStartupScruipt. Кроме того, в опубликованном обработчике аргументы scriptid и JavaScript по-прежнему меняются местами. Идентификатор сценария предшествует JavaScript. - person Mark M; 26.06.2012
comment
Все еще не работает. Я сделал необходимую поправку. Я заменяю свой код тем, что вы предложили в комментарии. Пробовал заменить scriptid на scriptid1, но все равно не работает. - person Microsoft Developer; 26.06.2012
comment
Еще два предложения: (1) Попробуйте this вместо this.Page в качестве первого аргумента для RegisterStartupScript. (2) Поместите точку с запятой после вашего JavaScript: "window.parent.location.href='ViewVendors.aspx';". - person Mark M; 26.06.2012
comment
.. Пожалуйста, просмотрите отредактированный мой вопрос. Теперь я получаю новую ошибку, если добавляю CalenderExtender - person Microsoft Developer; 27.06.2012
comment
Попробуйте использовать ‹%#...%› вместо ‹%=...%› в элементе скрипта. Вам нужно будет вызвать Page.Header.DataBind(); в обработчике загрузки вашей страницы. - person Mark M; 27.06.2012