file upload inside update panel loses the file in asp.net - c#

I have a update panel in a page and Whenever a value is selected from the dropdown box I display some text on the page, I have set triggers for the drop down, even after doing it the page does a post back when i change the drop down value, where am i going wrong
<asp:UpdatePanel ID="UP_DDL" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:FileUpload ID="File_Audio" runat="server" />
<asp:DropDownList ID="ddl_SendAt" runat="server" AutoPostBack="true"
OnSelectedIndexChanged="ddl2_SelectedIndexChanged">
<asp:ListItem Selected="True">Now</asp:ListItem>
<asp:ListItem>After 1 Hour</asp:ListItem>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddl_SendAt" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
I want the DropDownList to make a postback to display contents in text box, but I have a file upload button as well. When I select a file from computer and change the dropdown list a post back happens and the file upload loses the file

I would bascially not recommend a FileUpload control inside an UpdatePanel. A file upload normally needs a full postback.
Except if you implement your file upload inside a frame.

Check that your ScriptManager's EnablePartialRendering property is not set to False, and remove it or set it to True

Related

ASP.NET UpdatePanel not working, it refreshes the whole page

I'm new in using UpdatePanel, I Have 2 DropDownList:
DropDownList_1 and DropDownList_2
where DropDownList_2 content will be dependent to DropDownList_1 selected value, here is my code:
ASPX:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="DropDownList_1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DropDownList_1_SelectedIndexChanged" DataSourceID="businessgroup" DataTextField="BusinessGroupName" DataValueField="Id"></asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList_1" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<asp:DropDownList ID="DropDownList_2" runat="server" DataSourceID="jobposition" DataTextField="JobPositionName" DataValueField="Id"></asp:DropDownList>
CS:
protected void DropDownList_1_SelectedIndexChanged(object sender, EventArgs e)
{
SqlDataSource1.SelectCommand = "SELECT DISTINCT * FROM [JobPosition] WHERE BusinessGroupID ="+DropDownList_1.SelectedValue;
DropDownList_2.DataBind();
}
its working as stated above but what I doesn't want in my output is the whole page refreshes, I also tried removing AutoPostBack="true" in my DropDownList_1 but it stops working, what am I doing wrong in here? Thanks!
EDIT:
I also tried moving the DropDownList_2 inside UpdatePanel's ContentTemplate but still the whole page is refreshing.
Here is how you should do:
If you want to refresh the second drop-down, than the second drop-down should be inside an update panel
Set AutoPostBack="true" only for the second drop-down
Set UpdateMode="Conditional" for the update panel (otherwise they will refresh every time)
Set the AsyncPostBackTrigger of the panel to point to the first drop-down SelectedIndexChanged event
Set ChildrenAsTriggers="true" for the Update panel
:
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList_1_SelectedIndexChanged" DataSourceID="businessgroup" DataTextField="BusinessGroupName" DataValueField="Id"></asp:DropDownList>
<asp:DropDownList ID="DropDownList_2" runat="server" AutoPostBack="true" DataSourceID="jobposition" DataTextField="JobPositionName" DataValueField="Id"></asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList_1" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
The controls should reside in the same update panel, it's simpler this way.
I found the fix, thanks to Cristina for reminding me to check the console errors. And just for reference to anyone who is having the same problem here is what I've done:
I have missing Ajax libraries, so I imported the MicrosoftAjax.js and MicrosoftAjaxWebService in this folder Scripts>WebForms>MSAjax.
After I imported the necessary Ajax library I've got this console error:
MicrosoftAjaxWebForms.js:6 Uncaught
Sys.WebForms.PageRequestManagerServerErrorException:
Sys.WebForms.PageRequestManagerServerErrorException: Invalid postback
or callback argument. Event validation is enabled using in configuration or <%# Page
EnableEventValidation="true" %> in a page. For security purposes,
this feature verifies that arguments to postback or callback events
originate from the server control that originally rendered them. If
the data is valid and expected, use the
ClientScriptManager.RegisterForEventValidation method in order to
register the postback or callback data for validation.
What I did is add EnableEventValidation="false" inside this Ajax page, in <%Page %> directive.
And after that I have no longer full page reload and all is working now on how I wanted.
If your panel still posts back after you've set it up as per guidelines, check that you have not set ClientIDMode="Static" either for the specific control performing the callback or by causing the ClientIDMode to default to static inherited from either in web.config, the Page or parent containers.
Search your solution for ClientIDMode="Static" and either change this for inherited controls including the one triggering the postback, or explicitly set ClientIDMode="Predictable" or ClientIDMode="AutoID" for each of your controls that trigger a postback.
While you are working with update panel you have to register your events while refreshing the page for that you have to use Microsoft's PageRequestManager
to re-subscribe every update.
You have to initialize your event in the document.ready(function(){})
of the javascript.
Ex: var test=Sys.WebForms.PageRequestManager.getInstance();

UpdatePanel doesnt work as intended for file upload control

When I click on the attach button, It adds a new row to the grid with the postedFile name.
But its also causing the whole page to refresh, as if the updatePanel doesnt exist. Whereas, I would like just the gridview to update. Why does this have to be this way with file upload controls. The UpdatePanel works as desired for other controls/grids on page.
I do not have a knowledge on jquery, so have to work it out only with c#. Any suggestions.
<asp:updatepanel runat="server" updatemode="conditional">
<triggers>
<asp:postbacktrigger controlid="btnAttach"/>
</triggers>
<contenttemplate>
<asp:gridview ...../>
<asp:fileupload id="fup" runat="server">
<asp:button id="btnAttach" text="attach" runat="server/>
</contenttemplate>
</asp:updatepanel>
i suggest you to use the ajax asyncFileUploader
Link
Link
it will help you without postback and without jquery
it use plain javascript and its easy the following link containing the example also
Fileupload is one of the controls that is not compatible with updatepanel:
Read here

How to not loose the selected item index in a post back using ajax?

I am writing a visual web part which has ajax implemented.
I have bunch of web controls like checkboxlist,dropdownlist,radiobuttonlist.
I have set autopostback equals to true so that some server events happens in every item selection.
I want to retain the cursor in each control after selection right now i have focus on the control but the selection index goes to the 0 item.
Is there a way to retain it in the same item after postback. so that nobody feels that there is even a postback.
here is my code
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="subj" EventName="SelectedIndexChanged"/>
</Triggers>
<ContentTemplate>
<asp:RadioButtonList ID="subj" runat="server"
OnSelectedIndexChanged="rsubj_SelectedIndexChanged"
AutoPostBack="True"
ValidationGroup="UserProfile">
<asp:ListItem Value="mans">Humans</asp:ListItem>
<asp:ListItem Value="rman primates">Non-Human primates</asp:ListItem>
<asp:ListItem Value="bidents">Rodents</asp:ListItem>
<asp:ListItem Value="teachers">Others</asp:ListItem>
</asp:RadioButtonList>
and server side on the indexchanged event i am setting the focus like this
protected void rsubj_SelectedIndexChanged(object sender, EventArgs e)
{
rdb_studysubj.Focus();
is there a way we can preserve the selected item index evertime the page postbacks in the current control. I have different controls like radiobuttonlist, checkboxlist,dropdownlist. i dont want to loose the selected item index after postback...
any help

Search using Update Panels

Is it possible to use an UpdatePanel that has like a few text boxes, and a search button, and then perhaps another UpdatePanel that has a gridview in it to return the results of what was searched. When the user clicks search it hides the boxes, and displays the gridview. Can I do this with UpdatePanels? I am using c# for my coding. Or should I be doing this another way?
You only need one UpdatePanel in that case and setup a Trigger to your search Button.
Put only the controls that will be refreshed in your UpdatePanel.
Example:
<asp:TextBox ID="txtSearchCriteria" runat="server" />
<asp:Button ID="btnSearch" runat="server" OnClick="btnSearch_Click" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:GridView ID="grdSearchResults" runat="server">
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
Implement the btnSearch_Click function to execute your search and bind the results to the GridView. The UpdatePanel will handle the ajax call and replacing of the HTML that the GridView will produce.
You want to keep as much out of the UpdatePanel as possible and only include what will actually change because it is transmitting that HTML with each update so it's a waste of resources if you are not actually doing anything to those controls with each action. That is why a trigger is best to be used in this case which will hook the UpdatePanel to the Click event outside of the UpdatePanel scope.
Read up more on UpdatePanel and how triggers work on MSDN.
If I understand the question correctly, you can do that with two <asp:Panel> controls inside the <UpdatePanel>. One panel for the textboxes, and the other for the gridview. You set which panel to show in the codebehind, depending on whether you're expecting your user to enter search criteria, or review the search results.
Yes you can.
You also could use just one update panel. Since you the Search Form (could be in a Panel) and the GridView inside the UpdatePanel.

FileUpload is not working within update panel

So what I am trying to do is, have a user select a file to upload. Since I am only going to accept images, I will test the extension. I also want to limit the file size to under 2mb, so I will test that(haven't implemented in code yet). If the file they have selected passes, then I want the label to say "File Accepted", and store the file upload information for a later button click. This will happen once the user has finished filling out the rest of the form. Eventually, I will put an UpdateProgress control on the page while it is checking if the file is allowed. I would rather not have it post back for this, so if I can get it to work, that would be great. BTW, this will all work fine if I take the label out of the update panel.
What happens when I run this, is it will go to the else statement of the first if and return "Please select a file." Meaning that FileUpload1.HasFile is returning false. The only reason I can see that this is happening is because the UpdatePanel can not access that info from the FileUpload control?
Code Behind:
Label SubmitButtonLabel2= (Label)UpdatePanel1.FindControl("SubmitButtonLabel");
if (FileUpload1.HasFile)
{
string[] fileName = FileUpload1.FileName.Split('.');
if ((fileName[fileName.Length - 1] == "jpg") ||
(fileName[fileName.Length - 1] == "gif") ||
(fileName[fileName.Length - 1] == "bmp") ||
(fileName[fileName.Length - 1] == "jpeg") ||
(fileName[fileName.Length - 1] == "png"))
{
SubmitButtonLabel2.Text = "File Accepted.";
}
else
{
SubmitButtonLabel2.Text = "File type not allowed. Please choose another.";
}
}
else
{
SubmitButtonLabel.Text = "Please select a file.";
}
Page:
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="SubmitButton" runat="server" Text="Submit File" OnClick=SubmitButton_Click />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="always">
<ContentTemplate>
<asp:Label ID="SubmitButtonLabel" runat="Server" />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="SubmitButton" />
</Triggers>
</asp:UpdatePanel>
</div>
</form>
</body>
No need to do anything you just need to add multipart data attribute to your form.
Page.Form.Attributes.Add("enctype", "multipart/form-data");
See the following link for more details.
http://knowledgebaseworld.blogspot.com/2009/02/file-upload-not-working-with-update.html
<Triggers>
<asp:PostBackTrigger ControlID="YourControlID" />
</Triggers>
Add the trigger for the UpdatePanel and give the ControlID. In case you are using TabContainer, use the ID of the tab container.
Add this line in your page_load
ScriptManager.GetCurrent(this).RegisterPostBackControl(this.Button);
If you use FileUpload control in Update panel you have to set PostbackTrigger for the button you write the code to save the upload file.
Now Following code I have btnSave button for save the file in the upload folder. So I set the postbacktrigger for it.
<Triggers>
<asp:PostBackTrigger ControlID="btnSave" />
</Triggers>
Hope this will help you.
Default asp.net FileUpload control will never work with UpdatePanel. You need special AsyncFileUpload control as defined in AjaxControl Toolkit. This
http://www.asp.net/ajax/ajaxcontroltoolkit/samples/AsyncFileUpload/AsyncFileUpload.aspx
alt text http://ruchitsurati.net/files/fileupload.png
<ajaxToolkit:AsyncFileUpload OnClientUploadError="uploadError"
OnClientUploadComplete="uploadComplete" runat="server"
ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern"
UploadingBackColor="#CCFFFF" ThrobberID="myThrobber" />
Don't forget to change the type of the form, to allow file uploads (enctype or something like that, i'm not in front of Visual Studio so can't be that precise.)
I had the same problem.
Make the the button to upload the file as the trigger of the Upload panel
Something like this,
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="pnlUploadImage" runat="server">
<asp:FileUpload ID="fuldImage" runat="server"></asp:FileUpload>
<asp:LinkButton ID="lnkbUpload" runat="server" onclick="lnkbUpload_Click">Add</asp:LinkButton>
</asp:Panel>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="lnkbUpload"/></Triggers>
</asp:UpdatePanel>
I got it working after using two of the solutions posted here.
I had to add both
Page.Form.Attributes.Add("enctype", "multipart/form-data");
on Page_Load as well as
<Triggers>
<asp:PostBackTrigger ControlID="btnUpload" />
</Triggers>
on the markup for the update panel.
Page.Form.Attributes.Add("enctype", "multipart/form-data");
Doing this will solve your problem.
Refer to this article.
You're answer can be found here
It is basically disallowed by default because of javascript and browser security reasons. But this is a workaround.
My guess would be that the HasFile will only be filled when the post is already done, not before that.
You might want to check if the FileUpload1.FileName is already filled before the post is done, but I kinda doubt that.

Categories

Resources