Showing posts with label popup. Show all posts
Showing posts with label popup. Show all posts

Wednesday, March 28, 2012

Installing Ajax Controls

I have been using Ajax on my sites for a few months now. I went to use a control extension, modal popup, and got an error. It was looking for something on my desktop.

    I decided to reset the toolbox hoping that it would correct itself, and the control extension tab disappeared.Removed the ajax control program from the system via the control panel add/remove.Downloaded ASPAJAXExtSetup.msi and installed it.

Now I still do not have the control extension tab. It also blew up on this line in the web config:

<add tagType="System.Web.UI.WebControls.CompareValidator" mappedTagType="System.Web.UI.Compatibility.CompareValidator, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

This seems to be a common problem, but since I was not using validation controls I just deleted the lines and it compiled.

Any ideas how I can get those controls back?

what version did you uninstall? Its my understanding that ajax breaks the validators in the most recent version and in order to use them you must add those tagmappings.

http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx

Follow the directions here and you should be good. It works for me.


I am not sure what version I uninstalled. I have no problems with the validators. My problem is that I cannot add the extended controls to my toolbox. For example, modal popup, tabs, accordian. I've downloaded the Control Toolkit and have run AjaxControlExtender.vsi. When I open up an ASP.NET site I do not get the controls in my Toolbox. Any ideas?
Right click in the toolbox and click Add Tab. Create a new tab called, AJJAX Toolkit. Once created click in the tab and click add controls/items. When the window comes up navigate to the AjaxToolkit.dll and click add. This should all the items.
That fixed it. When I was using atlas I had to do it this way, but this time I could not remember which dll it was. Thank you.

Saturday, March 24, 2012

Internet Explorer freezes after using AJAX

Hi

I have a weird problem. I have created an ASP.NET site which is displayed as a popup in another website.
The popup shows a treeview with which the user can update some data via an webservice. After selecting a treenode, a webservice is called in the code behind.
When I open this popup two times it will freeze all Internet Explorer windows which belongs to the current website. Only restarting the Internet Explorer helps. There is no javascript error or any other exception.

I have made tests with similar websites without ajax without any problem., so I think this may have to do with ASP.NET AJAX. The problem occurrs with Internet Explorer 6 and 7.

This is the code of the popup website:

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div id="header">
<h1>
<asp:Label runat="server" Text="folder choice" ID="LaHeader"></asp:Label>
</h1>
</div>
<div id="haupt">
<div id="navi">
<asp:UpdatePanel runat="server" ID="UpPaTreeView" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:TreeView runat="server" ID="TrViStructure" DataSourceID="XmDaSoStructure" OnSelectedNodeChanged="TrViStructure_SelectedNodeChanged">
<DataBindings>
<asp:TreeNodeBinding DataMember="Root" PopulateOnDemand="True" TextField="Name" ValueField="GUID" />
<asp:TreeNodeBinding DataMember="Folder" TextField="Name" ValueField="GUID" />
<asp:TreeNodeBinding DataMember="Underfolder" TextField="Name" ValueField="GUID" />
</DataBindings>
<NodeStyle CssClass="TreeItem" />
<HoverNodeStyle CssClass="TreeItemHovered" />
<SelectedNodeStyle CssClass="TreeItemSelected" />
</asp:TreeView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
<div id="content">
<asp:UpdatePanel ID="UpPaStatus" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:Panel ID="PaButton" runat="server" Visible="false">
<div id="controls">
<asp:Button OnClientClick="closewindow()" runat="server" CssClass="button" Text="Close"
ID="BuClose" />
</div>
</asp:Panel>
<asp:Panel ID="PaMessage" runat="server" Visible="false">
<div id="label">
<asp:Label ID="laErrorHeader" runat="server" Text="Header"></asp:Label><br />
<asp:Label ID="laErrorMessage" runat="server" Text="Label"></asp:Label>
</div>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpPaTreeView">
<ProgressTemplate>
<div id="update">
<img src="img/ajax-loader-blueBg.gif" />
</div>
</ProgressTemplate>
</asp:UpdateProgress>
</div>
</div>
<asp:XmlDataSource runat="server" ID="XmDaSoStructure" DataFile="~/XML/Folders.xml">
</asp:XmlDataSource>
</form>

<script type="text/javascript">
function closewindow()
{
window.opener = this;
window.close();
}

</script>

</body>


Hi c.kr

It is not recommended to add the line number in your source code. Would you please modify it and provide more C# code and XML file related to your page ?


Hi, sorry for the line numbers, I removed it.

This is the used xml file for the treeview:

<Folder Name="foobar" GUID="some guid">
<Folder Name="foobar2" GUID="some guid2"></Folder>
<Folder Name="foo" GUID="5871D39C-7DD0-DB11-A445-0003FF6D5330">
<Folder Name="bar" GUID="E8C495C8-7DD0-DB11-A445-0003FF6D5330">
</Folder>
</Folder>
</Folder>
 This is the code behind file for the webpage:
public partialclass FolderChoice : System.Web.UI.Page
{
string _objectId =string.Empty;
CrmService _service;

private SessionData sessionData
{
get {return Session["SessionData"] ==null ?null : (SessionData)Session["SessionData"];
}
set { Session["SessionData"] =value;
}
}

protected void Page_Load(object sender, EventArgs e)
{
sessionData = CRMplusServiceConnector.GetSessionData(Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"]);
_objectId = Server.UrlDecode(Request.QueryString["oId"].ToString());

LaHeader.Text = sessionData.Translation["folderchoice.LaHeader"];
BuClose.Text = sessionData.Translation["folderchoice.BuClose"];
}

private void ConnectToCrm()
{
_service =new CrmService();

_service.Url = CRMplusServiceConnector.Configuration["crmServiceUrl"];
_service.Credentials = System.Net.CredentialCache.DefaultCredentials;

//----------------------
// Gets the Current User's Information
//---------------------- WhoAmIRequest userRequest =new WhoAmIRequest();
WhoAmIResponse userResp = (WhoAmIResponse)_service.Execute(userRequest);

//----------------------
// Set UserId of current User as CallerId
//---------------------- _service.CallerIdValue =new CallerId();
_service.CallerIdValue.CallerGuid = userResp.UserId;

//----------------------
// Cache credentials so we don't have to re-authenticate on each request.
//---------------------- _service.PreAuthenticate =true;
}

protected void TrViStructure_SelectedNodeChanged(object sender, EventArgs e)
{
this.PaMessage.Visible =false;

PaButton.Visible =false;
TrViStructure.Enabled =false;
TrViStructure.EnableClientScript =false;

SelectFolder();

TrViStructure.Enabled =true;
TrViStructure.EnableClientScript =true;
PaButton.Visible =true;
}

private void SelectFolder()
{
try { ConnectToCrm();// Create the target object for the request TargetRetrieve<someEntitiy> targetDoc =new TargetRetrieve<someEntity>();

// Set the target object's IDstring guiddoc = _objectId.Replace('{',' ');
guiddoc = guiddoc.Replace('}',' ');
guiddoc = guiddoc.Trim();
targetDoc.EntityId =new Guid(guiddoc);

// Create the request object RetrieveRequest reqDoc =new RetrieveRequest();

// Set the request object's properties reqDoc.Target = targetDoc; reqDoc.ColumnSet =new AllColumns();

// Execute the request RetrieveResponse retDoc = (RetrieveResponse)_service.Execute(reqDoc); <someEntity> curDoc =new <someEntity>();
if ( retDoc.BusinessEntity !=null )
{
curDoc = (<someEntity>)retDoc.BusinessEntity;
}
else { Environment.Exit(1); } curDoc.new_documentfolderid =new Lookup();
curDoc.new_documentfolderid.type = EntityName.new_folder.ToString();
curDoc.new_documentfolderid.Value =new Guid(TrViStructure.SelectedNode.Value.ToString());
_service.Update(curDoc);
}
catch ( System.Web.Services.Protocols.SoapException exc )
{
ShowException(exc);
}
}

private void ShowException(System.Web.Services.Protocols.SoapException exc)
{
this.PaMessage.Visible =true;
this.laErrorHeader.Text = sessionData.Translation["folderchoice.LaError"];
this.laErrorMessage.Text = exc.Detail.InnerText;
}
}

I replaced one of our classes with <someEntity>. The service which is called belongs to Microsoft Dynamics CRM.

Hi c.kr,

Sorry for the delay.I'm failed to reproduce your problem after wholly copied your code into a new project. The best way to indicate the exact root cause is dubugging it step by step in VS2005. By the way, Treeview control is not support very well inside UpdatePanel.http://ajax.asp.net/docs/overview/UpdatePanelOverview.aspx please focus on "Controls that Are Not Compatible with UpdatePanel Controls ".

If you has found it , please share it with us.

invoke ModalPopUp from GridView button

I've got a ModelPopUp that works just fine from a LinkButton.

Now I need to launch the popup from a button in a GridView column/cell. Is there a way to specify that button in TargetControlID property - or is there another way I can programmatically invoke the modalpopup?

I Have a similar problem. I need to launch the popup from a treeview node, with the added hassle that I also need the modal popup to know the Id of the tree node that poped it up!

If I find a solution, I will post here for you.


Well, I can't say this is real elegant, but the way I do it is to put a button on the form, outside of the GridView and set its class so it's not visible (Make sure you use a style and not God forbid, the control's visible property!) Use this button's ID as your TargetControlID.

Attach a client side script to the button in your GridView that is supposed to launch the popup. In the script, call the fake button's click event.

So the code will be something like this:

<asp:ButtonID="ProxyButton"runat="server"CssClass="hidden"/>

<atlasToolkit:ModalPopupPropertiesTargetControlID="ProxyButton" .../>

In the GridView:

<asp:ImageButtonID="..."runat="server"OnClientClick="fakeClick()" .../>

The script:

function fakeClick() {

$('ProxyButton').click();

}

Hope it helps.

Kathy


Thanks Kathy - this does invoke the modal dialog just fine, but it generates two problems I'm hoping you can help with. The first is that the ProxyButton postback clears the modal just as soon as it's shown. Second, I don't know how to access the commandargument from the script - this contains the ID of which grid row the button was clicked on.

Any help?


As for the first problem, I don't think that the proxy button's postback is causing the refresh. It's a fake click after all. It's most probably the button in the GridView (or imagebutton or linkbutton or whatever it is). I don't know your exact scenario, but you may want to consider one of the following options:

1- Use an html control in your grid to invoke the click event of the fake button. Something like a simple div or img with its onclick event set to fakeClick(). As you know these won't cause a postback.

2- Enclose your GridView in an atlas:UpdatePanel. This will keep the button from posting back, too.

As for the second one, if you populate your GridView in the code (as opposed to automatically), you can bind the click event there and pass whatever argument you want, in there, too. Like say you want to launch the popup upon clicking an imagebutton control called Modify, in the grid, and you want to pass the ID of the record as the argument (assuming you got the value in sID and assuming you write VB code):

Dim ibModifyAs ImageButton

ibModify =CType(e.Row.FindControl("Modify"), ImageButton)

ib.Attributes.Add("onClick","fakeClick('" & sID &"')")

If you populate the grid automatically, there is a syntax for doing this in the aspx code itself, but I'm not sure of it. So the good news is that tt can be done and the bad news is that you have to do a little more searching on it. (I will post it if I remember it!)

Now you have to alter the fakeClick script to accept an input argument. You can pass it from there and do anything you want to do. Just to give you a heads up, if you are trying to populate your popup control dynamically, I hope you just have a little html code that needs to go in there. If you want to populate it dynamically, with server controls and all, you're in for a ride :)

Hope this helps.

Kathy


Hi everyone,

You might be interested in checking outhttp://forums.asp.net/thread/1404770.aspx which provides an example of invokingModalPopup from the server in response to aCommand event.

Thanks,
Ted

Are you sure that your javascript will work!?

function fakeClick() {

$('ProxyButton').click();

}

I think NO, becauseProxyButton is asp:Button

and $('ProxyButton') will be NULL, /$('ProxyButton')=document.getElementById('ProxyButton'), butProxyButton should be HTML element

What you think?


Hi StoyanPetrov,

The JavaScript should be fine - the asp:Button will render an HTML DOM element with the same name which then gets picked up by $.

Thanks,
Ted

Hi,

I've been trying to do the same thing and as mentioned above. The page does do an AJAX postback which will cause all the controls to be reset and hence the popup to disappear( you can test this by putting a breakpoint on the Page_Load function).

I found a fairly clumsy way around this. you basically have to do the following.

i) add an event handler for OnRowCreated for the gridview and bind an event handler to the button. In this case called ButtonX

protected void RowAdding(object o,GridViewRowEventArgs e)
{
ImageButton ib=(ImageButton)e.Row.FindControl("ButtonX");
if (ib != null)
{

ib.Click += new ImageClickEventHandler(ib_Click);

}

}

ii) in that event handler store the popup state in the session and refresh the updatepanel

void ib_Click(object sender, ImageClickEventArgs e)
{
Session["ShowPane"] = "1";
UpdatePanel1.Update();

}

iii) override the render and show the panel based on the session

protected override void Render(HtmlTextWriter writer)
{

if (Session["ShowPane"] != null)
{
if (Session["ShowPane"].ToString() == "1")
{
ModalPopupExtender1.Show();
}
}


base.Render(writer);
}

I think the smart thing to do would be to stop the postback in the firstplace, does anyone know how to do this?

Invoking ModalPopupExtender causes Submit button to not postback

I have a simple webform that contains a textbox and a required field validator. The page also has a modal popup extender tied to a button as well as two other buttons for saving the page's input and canceling the pages changes. The cancel button has causesvalidation="false".

I run the web application and on the page in question click the button that causes modal popup to show and then hide the modal popup. The textbox on the page does not have any text and so the validator shows the invalid message. When I click the 'Cancel' button the first time the page does nothing. If I click it again, the server side event handler is fired. Given that causesvalidation is set to false I expected the server event handler to fire on both occasions.

Here is the sample code that displays the said behavior -

<asp:ScriptManager ID="scriptManager1" runat="server" />
<div>
<asp:Label ID="label1" Text="Label1" runat="server" />
<asp:TextBox ID="textbox1" runat="server" />
<asp:RequiredFieldValidator ID="textRequiredFieldValidator" ControlToValidate="textbox1"
Text="*" runat="server" />
<br />
<asp:Button ID="popperUpperButton" Text="Show Popup" runat="server" />
<asp:UpdatePanel ID="pageUpdatePanel" UpdateMode="Always" runat="server">
<ContentTemplate>
<asp:Button ID="submitButton" Text="Send" OnClick="SubmitButton_Click" runat="server" />
<asp:Button ID="pageCancelButton" Text="Cancel" CausesValidation="false" OnClick="PageCancelButton_Click"
runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
<br />
<asp:Label ID="statusLabel" runat="server" />
<act:ModalPopupExtender PopupControlID="modalPopupPanel" TargetControlID="popperUpperButton"
OkControlID="okButton" CancelControlID="leavePopupLinkButton" runat="server" />
</div>
<asp:Panel ID="modalPopupPanel" runat="server">
Just some text that is shown in the popup window.
<asp:Button ID="okButton" Text="OK" runat="server" />
<asp:LinkButton ID="leavePopupLinkButton" Text="Leave Popup" runat="server">
</asp:LinkButton>
</asp:Panel>

Server event handler code -

protected void Page_Load(object sender, EventArgs e)
{

}

protected void SubmitButton_Click(object sender, EventArgs e)
{
this.statusLabel.Text += "submit clicked...";
}

protected void PageCancelButton_Click(object sender, EventArgs e)
{
this.statusLabel.Text += "cancel clicked...";
}

Has anyone else seen this behavior and is there a known fix? I am seeing it consistently on the application I am building.

Thanks in advance,

Ruwan

Why are the submitButton and cancelButtons in an UpdatePanel but the textbox is not? Could you try to get the page working without the updatepanel first? I am not sure this issue has anything to do with the modalpopup being on the page.


Thanks for the response. I have tried the above with and without the updatepanel and see the same result. My reason for suspecting some coupling with the ModalPopupExtender is that the issue does not show up till the ModalPopupExtender is placed on the page.

The updated ASPX page reads -

<asp:ScriptManager ID="scriptManager1" runat="server" />
<div>
<asp:Label ID="label1" Text="Label1" runat="server" />
<asp:TextBox ID="textbox1" runat="server" />
<asp:RequiredFieldValidator ID="textRequiredFieldValidator" ControlToValidate="textbox1"
Text="*" runat="server" />
<br />
<asp:Button ID="popperUpperButton" Text="Show Popup" runat="server" />
<asp:Button ID="submitButton" Text="Send" OnClick="SubmitButton_Click" runat="server" />
<asp:Button ID="pageCancelButton" Text="Cancel" CausesValidation="false" OnClick="PageCancelButton_Click"
runat="server" />
<br />
<asp:Label ID="statusLabel" runat="server" />
</div>
<asp:Panel ID="modalPopupPanel" runat="server">
Just some text that is shown in the popup window.
<asp:Button ID="okButton" Text="OK" runat="server" />
<asp:LinkButton ID="leavePopupLinkButton" Text="Leave Popup" runat="server">
</asp:LinkButton>
</asp:Panel

Thanks,


have you tried adding a validationgroup attribute to the validator and the submit button. adding a attribute like validatorgroup="vg1" to both should cause all other control to ignore the validation except what is part of the group. This may help.


also, I will agree with kirtid, the use of the update panel may be part of the problem. Your update panel only wraps the 2 buttons, so clicking 1 will fire but you will not be able to see the results. if the label is NOT in the update panel. it will not be updated. Try moving the label into the update panel and see if it gets written to. also move the textbox and validator into the UP as well so they can be fired and accessed. I just ran that code with all of them inside the update panel, and it worked for me.

-Alan


Alan,

The ValidationGroup suggestion has provided a work-around for the test application, which now works fine. I will merge the solution in the product that first brought up the issue.

Thanks for the help!