2010-08-24 26 views
4

Le scénario:
J'ai une page web ASP.Net que je l'intention d'utiliser pour laisser l'utilisateur (et non les utilisateurs réels, mais le gestionnaire de contenu essentiellement) insérer et modifier les enregistrements dans un table en utilisant un formulaire. Ce formulaire est dans un UpdatePanel, car j'utilise également des listes déroulantes en cascade pour permettre à l'utilisateur de sélectionner certaines valeurs. Maintenant, cette FormView contient également 4 contrôles FileUpload, et comme vous le savez peut-être, ces contrôles fileupload nécessitent une publication complète puisque la plupart des navigateurs ne permettent pas à Javascript d'accéder au disque. Donc, ce problème aurait été résolu en faisant quelque chose comme:FileUpload à l'intérieur d'un FormView UpdatePanel

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <Triggers> 
      <asp:PostBackTrigger ControlID="InsertButton" /> 
      <asp:PostBackTrigger ControlID="UpdateButton" /> 
      </Triggers> 
        <ContentTemplate>....</ContentTemplate> 
</asp:UpdatePanel> 

Edit: Vous avez oublié d'ajouter que le fileuploading a lieu dans les OnUpdating et OnInserting événements de la SqlDataSource.

Le problème:
Depuis le InsertButton et l'UpdateButton résident à l'intérieur du FormView, je ne peux pas accéder directement à leur identité de par balisage. Et MSDN says que:

ajouter Programmatically contrôles PostBackTrigger n'est pas pris en charge.

Veuillez suggérer une solution pour que cela fonctionne. Toute idée à ce sujet est très appréciée. Merci.

PS- Une solution viable pour moi était de définir comme l'ensemble FormView se PostBackTrigger du UpdatePanel:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <Triggers> 
      <asp:PostBackTrigger ControlID="FormView1" /> 
      </Triggers> 
        <ContentTemplate>....</ContentTemplate> 
</asp:UpdatePanel> 

Mais maintenant, en raison d'un peu de changement dans les exigences, cette solution (si vous appelez une solution) est inacceptable.

Répondre

2

Yay !! Finalement, je l'ai eu au travail!

Voici comment:

Eh bien contrairement à ce que dit MSDN, nous pouvons en effet ajouter PostBack Déclencheurs Programmatically. Pas nécessairement au UpdatePanel, mais au ScriptManager.

Après des heures de jeu autour, voici ce qui a fonctionné:

Nous ne sommes pas en mesure d'accéder à des commandes dans un FormView, jusqu'à ce que le modèle a été rendu, donc nous ne peut ajouter postback déclenche après OnDataBound événement du formview.

protected void FormView1_DataBound(object sender, EventArgs e) 
    { 
     if (FormView1.CurrentMode == FormViewMode.Edit) 
     { 
      LinkButton lb = (LinkButton)FormView1.FindControl("UpdateButton"); 
      ScriptManager.GetCurrent(Page).RegisterPostBackControl(lb); 
     } 

     //Similarily you can put register the Insert LinkButton as well. 
    } 

Et maintenant, si votre UpdatePanel cause ConditionalUpdate, vous pouvez faire quelque chose comme ça pour le faire fonctionner:

Le balisage:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate>.. 
      <EditItemTemplate> 
       ... 
      <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" OnClick="Cause_PostBack"CommandName="Update">Update</asp:LinkButton> 
      ... 
      </EditItemTemplate> 
      ..</ContentTemplate> 
</asp:UpdatePanel> 

CodeBehind:

//call this function as the OnClick Event Handler for the Controls you want to register as 
//triggers. 
protected void Cause_PostBack() 
    { 
     UpdatePanel1.Update(); 
    } 

Sinon, si votre situation le permet (comme le fait le mien), réglez simplement lede UpdatePanel.

+0

merci beaucoup (Y), vous économisez ma journée !!! par juste FormView1_DataBound. –

3

Avez-vous déjà parlé de l'utilisation d'Iframe pour effectuer la publication? quelque chose comme:

<iframe name="uploader" id=uploader 
      src="uploaderSender.aspx?AllowedExtension=<%= AllowedExtension %>&StoringPath=<%= StoringPath %>&StoringFileName=<%= StoringFileName %>&OldFileName=<%= OldFileName %>&MaximumSize=<%= MaximumSize %>" 
     width="450" height="50" frameborder=0 scrolling=no > 
     </iframe> 

avec uploaderSender.aspx comme:

<form action="UploaderReceiver.aspx" method="post" enctype="multipart/form-data"> 
<input type="file" name="file" id="file" onchange="document.getElementById('IsFileUploading').style.visibility = 'visible'; document.forms[0].submit()"/> 

    <span id="IsFileUploading" style="visibility: hidden"> 
     <asp:Image ID="Image1" runat="server" ImageUrl="~/immagini/Ajax-loader.gif" /> 
    </span> 
</form> 

et UploaderReceiver.aspx comme:

protected void Page_Load(object sender, EventArgs e) 
     { 

      //if there is one file to process 
      if (Request.Files.Count > 0) 
       //create the folder if it does'nt exists and returns the local path to get it 
       string StoringPathToBeSaved = StoringPath.GetFolderPath(); 

       // append the name of the file to upload to the path. 
          StoringPathToBeSaved = StoringPathToBeSaved + StoringFileName + Extension; 

          Request.Files[0].SaveAs(StoringPathToBeSaved); 

     } 

c'est juste des morceaux de code pour vous de savoir si vous serait intéressé par cette façon de traiter le téléchargement, je peux vous donner plus si vous voulez après.

vous voyez, et bonne chance avec votre code,

+0

Merci pour votre monsieur d'entrée, mais en fait je suis actuellement une sorte de débutant avec ASP.Net lui-même, et qui ont pas un iota d'une idée au sujet iFrame, et même si cela fonctionnerait comme vous le dites, mais je Je crains maintenant de devoir terminer cette tâche (et quelques autres aussi) dans quelques heures et je suppose qu'il me faudrait un certain temps pour apprendre les IFrames et les implémenter dans mon projet. En tout cas, merci pour votre aide. +1 à vous :) – Anchit

0

Ceci est ancien, mais essayait de résoudre un autre problème et s'est heurté à cela. Ce n'était pas mon problème, mais voici une alternative pour tous les nouveaux qui se heurte à cela aussi.

Vous avez déclaré votre problème:

Depuis le InsertButton et l'UpdateButton résident à l'intérieur du FormView, je ne peux pas accéder directement à leur identité de par balisage

Vous pouvez réellement accéder à leurs identifiants par balisage pour utiliser comme ControlID dans le PostBackTrigger. Il vous suffit d'utiliser le du bouton qui est créé dans la balise html de la page en tant que ControlID. Vous pouvez trouver le nom créé en visualisant la source de la page lorsque vous affichez la page dans le navigateur. Il s'agit généralement du nom du nom FormView + $ + du bouton. Par exemple, supposons que vous ayez un FormView nommé "FormView1" qui contient un bouton Insérer auquel vous avez donné l'ID "btnInsert" lors de la conception. Si vous ouvrez votre page dans le navigateur pour l'afficher en direct et ensuite afficher la source de la page, vous remarquerez que le balisage html du bouton se verra attribuer le nom "FormView1 $ btnInsert".

Utilisez ce nom comme ControlID dans votre PostBackTrigger et votre panneau de mise à jour fonctionnera.

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <Triggers> 
      <asp:PostBackTrigger ControlID="FormView1$btnInsert" /> 
     </Triggers> 
     <ContentTemplate>....</ContentTemplate> 
</asp:UpdatePanel>