Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1879 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[ASP.NET] Bizarrerie avec les URL (ne correspondent pas !)

n°2303294
leujuiphe
Posté le 12-07-2017 à 20:14:36  profilanswer
 

Reprise du message précédent :
 :hello:  
 
Tu n'utilises pas le bon control. "Label" sert à afficher du texte.
De mémoire ce que tu veux c'est le control asp:Image
 
Par contre je ne comprends pas trop pourquoi tu utilises une listview pour afficher un tableau.
Tu devrais plutôt utiliser une gridview. Surtout que ça te donne accès par défaut à un tri, de la pagination et du binding auto


---------------
"Je ne suis pas con, je fais de la rétention d'intelligence, Nuance" Philippe Geluck. ---- Ils sont chauves mes smileys
mood
Publicité
Posté le 12-07-2017 à 20:14:36  profilanswer
 

n°2303295
mikekine
Posté le 12-07-2017 à 20:16:26  profilanswer
 

leujuiphe a écrit :

:hello:  
 
Tu n'utilises pas le bon control. "Label" sert à afficher du texte.
De mémoire ce que tu veux c'est le control asp:Image
 
Par contre je ne comprends pas trop pourquoi tu utilises une listview pour afficher un tableau.
Tu devrais plutôt utiliser une gridview. Surtout que ça te donne accès par défaut à un tri, de la pagination et du binding auto


Je suis justement occupé à tester avec :
 

Code :
  1. <asp:Image ... >


 
Mais ça ne donne pas grand chose, ma foi ! :o
 
Je me dirigerai vers le gridview si je ne trouve pas...  ;)

n°2303296
mikekine
Posté le 12-07-2017 à 20:24:49  profilanswer
 

En fait, je passe par le configurateur automatique de la Source de données de la Listview.
Je lui renseigne tout comme il faut; il m'affiche (même) l'image quand je teste la requête... Mais quand j'affiche la page web normalement, là, paf, pas d'image  :/

n°2303297
leujuiphe
Posté le 12-07-2017 à 20:41:12  profilanswer
 

et pourtant c'est bien asp:Image qu'il faut utiliser.
 
As tu vérifier que l'url de ton image est correcte ?
Ou est stockée ton image ? sur le file system ? en base de données ?


---------------
"Je ne suis pas con, je fais de la rétention d'intelligence, Nuance" Philippe Geluck. ---- Ils sont chauves mes smileys
n°2303298
mikekine
Posté le 12-07-2017 à 20:53:35  profilanswer
 

leujuiphe a écrit :

et pourtant c'est bien asp:Image qu'il faut utiliser.
 
As tu vérifier que l'url de ton image est correcte ?
Ou est stockée ton image ? sur le file system ? en base de données ?


 
L'image est stockée dans la DB sous le type Varbinary(max) / byte[] en C#
 
Est-ce que ça pourrait venir de là ?
 
 
J'ai testé avec un Gridview; sans la colonne Image, ça roule; mais quand j'ajoute cette dernière, j'ai une erreur :  
 

Citation :

Impossible de déterminer un MetaTable. Impossible de déterminer un MetaTable pour la source de données 'SqlDataSource1' et impossible d'en déduire un à partir de l'URL de la requête. Assurez-vous que le tableau est mappé à une source de données, que la source de données est configurée avec un type de contexte et un nom de tableau valides ou que la requête fait partie d'un DynamicDataRoute enregistré.


Message édité par mikekine le 12-07-2017 à 20:56:12
n°2303299
mikekine
Posté le 12-07-2017 à 21:17:34  profilanswer
 

J'ai corrigé l'erreur du message juste ci-dessus (fallait mettre Boundfield à la place de Dynamicfield).
 
Mais a présent, j'ai le même souci avec le Gridview que la Listview; tous les deux me marquent  
 

Citation :

System.Byte[]


 
à la place de l'image..

n°2303313
TotalRecal​l
Posté le 13-07-2017 à 09:08:39  profilanswer
 

Il faut vraiment que tu comprennes cette notion de client serveur dont on t'a déjà parlé.

 

Ton navigateur n'attend pas un troupeau de bytes, il veut une url qui contienne une image. Y a pas moyen d'afficher une image comme ça sortie de nulle part juste à partir de sa représentation binaire, il faut la convertir sous une forme qui parle à ton navigateur.

 

Tu dois faire une logique à part, qui côté serveur récupère le byte[] et le renvoie au client en lui faisant croire que c'est un fichier image.
Ex : https://stackoverflow.com/questions [...] in-asp-net (et sans doute plein d'autres liens)

Message cité 1 fois
Message édité par TotalRecall le 13-07-2017 à 09:09:31

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303317
mikekine
Posté le 13-07-2017 à 11:10:23  profilanswer
 

TotalRecall a écrit :

Il faut vraiment que tu comprennes cette notion de client serveur dont on t'a déjà parlé.
 
Ton navigateur n'attend pas un troupeau de bytes, il veut une url qui contienne une image. Y a pas moyen d'afficher une image comme ça sortie de nulle part juste à partir de sa représentation binaire, il faut la convertir sous une forme qui parle à ton navigateur.
 
Tu dois faire une logique à part, qui côté serveur récupère le byte[] et le renvoie au client en lui faisant croire que c'est un fichier image.
Ex : https://stackoverflow.com/questions [...] in-asp-net (et sans doute plein d'autres liens)


 
Je suis d'acc avec tout ce que tu dis !  
 
Néanmoins, j'ai vu, à force de recherches Google, que d'autres partageaient le même souci !  
Et aussi, comment se fait-il que l'outil de configuration de source de données de la Listview (SqlDataSource1) arrive à afficher l'image tout seul comme un grand lorsque je teste une requête, alors qu'à l'exécution, ça ne fonctionne pas ?

n°2303318
TotalRecal​l
Posté le 13-07-2017 à 11:20:24  profilanswer
 

Il y a peut être un handler directement dans les listview/gridview pour gérer directement un byte stream, je ne sais pas. T'as vu où ton truc qui marche, c'est pas clair ?
Dans tous les cas si tu veux de la souplesse pour l'affichage de tes images, ne te repose pas sur tes contrôles webforms, ça me parait mieux de fair un handler spécifique.


Message édité par TotalRecall le 13-07-2017 à 11:21:24

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303320
mikekine
Posté le 13-07-2017 à 11:36:35  profilanswer
 

Dans la 1ère caps, je choisis "Configurer la source de données" :
 
https://img4.hostingpics.net/pics/413187099.png
 
 
2nde caps, j'introduis la valeur 4 (Id_Personne = 4) :
 
https://img4.hostingpics.net/pics/471825100.png
 
 
Caps 3 : Je teste la requête avec Id_Personne = 4; ça me renvoie 2 articles :
 
https://img4.hostingpics.net/pics/819319101.png
 
 
Voilà !  ;)

mood
Publicité
Posté le 13-07-2017 à 11:36:35  profilanswer
 

n°2303321
TotalRecal​l
Posté le 13-07-2017 à 11:55:59  profilanswer
 

Ok. Ben t'as plus qu'à commencer par regarder le code généré côté client pour voir comment ça se comporte.

 

Mais à mon avis y a rien d'aussi intelligent qui gère ça en natif dans un listview/gridview, ça ne fonctionne que dans la preview en winform.
Pour faire marcher ça en ASP.Net je pense que tu dois faire ce que je disais.
Mais je peux me planter, même si ça me parait douteux ils ont peut être réellement fait un truc natif qui encapsule tout ce qu'il faut pour causer d'image avec le browser dans un contrôle...

Message cité 1 fois
Message édité par TotalRecall le 13-07-2017 à 11:56:26

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303323
TotalRecal​l
Posté le 13-07-2017 à 12:06:14  profilanswer
 
n°2303331
mikekine
Posté le 13-07-2017 à 12:59:19  profilanswer
 

TotalRecall a écrit :

Ok. Ben t'as plus qu'à commencer par regarder le code généré côté client pour voir comment ça se comporte.  
 
Mais à mon avis y a rien d'aussi intelligent qui gère ça en natif dans un listview/gridview, ça ne fonctionne que dans la preview en winform.  
Pour faire marcher ça en ASP.Net je pense que tu dois faire ce que je disais.
Mais je peux me planter, même si ça me parait douteux ils ont peut être réellement fait un truc natif qui encapsule tout ce qu'il faut pour causer d'image avec le browser dans un contrôle...


 
Par code généré côté client, tu entends utiliser l'outil Page Inspector de Visual Studio ? Ben en fait, cet outil n'existe plus depuis VS2015; moi, j'ai la 2017 Community.

n°2303359
mikekine
Posté le 13-07-2017 à 20:44:35  profilanswer
 


 
J'ai repris le code de ton lien :
 
Code dans le fichier C# :
 

Code :
  1. if (Request.QueryString["Id"] != null)
  2.             {
  3.                 string strQuery = "select A.Intitule, A.Description, A.Prix, A.Photo FROM Articles as A inner join Listes as L on A.Id_Liste = L.Id_Liste inner join Personnes as P on L.Id_Personne = P.Id_Personne where P.Id_Personne = @Id_Personne ";
  4.                 String strConnString = "Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS; Database=Listenoel;UID=Michael;PWD=****";
  5.                 SqlCommand cmd = new SqlCommand(strQuery);
  6.                 cmd.Parameters.Add("@Id_Personne", SqlDbType.Int).Value = Convert.ToInt32(Request.QueryString["Id"]);
  7.                 SqlConnection con = new SqlConnection(strConnString);
  8.                 SqlDataAdapter sda = new SqlDataAdapter();
  9.                 cmd.CommandType = CommandType.Text;
  10.                 cmd.Connection = con;
  11.                 DataTable dt = new DataTable();
  12.                 try
  13.                 {
  14.                     con.Open();
  15.                     sda.SelectCommand = cmd;
  16.                     sda.Fill(dt);                   
  17.                     GridView2.DataSource = dt;
  18.                     GridView2.DataBind();
  19.                 }
  20.                 catch
  21.                 {
  22.                     dt = null;
  23.                 }
  24.                 finally
  25.                 {
  26.                     con.Close();
  27.                     sda.Dispose();
  28.                     con.Dispose();
  29.                 }           
  30.             }


 
 
Avec ce code dans le fichier aspx :  
 

Code :
  1. <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns = "false" Font-Names = "Arial" Caption = "Using ImageField">
  2.                  <Columns>
  3.                      <asp:BoundField DataField = "Intitule" HeaderText = "Intitule" />
  4.                      <asp:BoundField DataField = "Description" HeaderText = "Description" />
  5.                      <asp:BoundField DataField = "Prix" HeaderText = "Prix" />
  6.                      <asp:ImageField DataImageUrlField = "Photo" DataImageUrlFormatString = "Webform4.aspx?Photo={0}" ControlStyle-Width = "100" ControlStyle-Height = "100" HeaderText = "Preview Image"/>
  7.                  </Columns>
  8.             </asp:GridView>


 
Malheureusement, l'image ne s'affiche toujours pas :/
 
https://img15.hostingpics.net/pics/734089102.png

n°2303365
mikekine
Posté le 14-07-2017 à 11:35:10  profilanswer
 

Y'a rien à faire, ça ne fonctionne pas [:sisicaivrai]
 
J'ai aussi essayé ce code :
 

Code :
  1. <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns = "false" Font-Names = "Arial" Caption = "Using ImageControl">
  2.                  <Columns>
  3.                      <asp:BoundField DataField = "ID" HeaderText = "ID" />
  4.                      <asp:BoundField DataField = "Name" HeaderText = "Image Name" />
  5.                      <asp:TemplateField>
  6.                          <ItemTemplate>
  7.                              <asp:Image ID="Image1" Height = "100" Width = "100" runat="server" ImageUrl = 'Qu'est-ce que je dois mettre ici ???' />
  8.                          </ItemTemplate>
  9.                      </asp:TemplateField>
  10.                  </Columns>
  11.             </asp:GridView>


Je fouille Google dans tous les sens, et je n'arrive toujours pas à savoir ce que je dois mettre dans le champ ImageURL à la ligne 7...
 
Et pour le code C# :  
 

Code :
  1. Byte[] bytes = (Byte[])dt.Rows[0]["Photo"];
  2.                     Response.Buffer = true;
  3.                     Response.Charset = "";
  4.                     Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
  5.                     Response.ContentType = dt.Rows[0]["Photo"].ToString();
  6.                     //Response.AppendHeader("content-disposition", "attachment;filename=" + dt.Rows[0]["Intitule"].ToString());
  7.                     //Response.BinaryWrite(bytes);
  8.                     Response.Flush();
  9.                     Response.End();


 
La ligne 6 m'ouvre une fenêtre me demandant ce que je veux faire avec la photo (ouvrir/enregistrer sous)
La ligne 7 m'affiche la photo toute seule au milieu de l'écran sans rien d'autre !
 
Non, mon problème depuis 2 jours, c'est de savoir comment faire la jonction entre les 2 codes; au plus je cherche, au plus ça s'obscurcit !

n°2303376
mikekine
Posté le 14-07-2017 à 15:36:08  profilanswer
 

Eureka !!!  
 
 
Je poste la "soluce" si ça intéresse qqn...
 
La classe ImageHandler (attention, encore quelques trucs à corriger...) :
 

Code :
  1. public class ImageHandler : IHttpHandler
  2.     {
  3.         public void ProcessRequest(HttpContext context)
  4.         {
  5.             string Id_Personne = "4";//context.Request.QueryString.Keys["Id_Personne"];
  6.             SqlConnection con = new SqlConnection("Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS; Database=Listenoel;UID=Michael;PWD=****" );           
  7.             SqlCommand cmd = new SqlCommand("select A.Intitule, A.Description, A.Prix, A.Photo FROM Articles as A inner join Listes as L on A.Id_Liste = L.Id_Liste inner join Personnes as P on L.Id_Personne = P.Id_Personne where P.Id_Personne = @Id_Personne" );
  8.             cmd.Parameters.Add("@Id_Personne", System.Data.SqlDbType.Int).Value = 4;// Convert.ToInt32(context.Request.QueryString["Id"]);             
  9.             cmd.Connection = con;           
  10.             DataTable dt = new DataTable();
  11.             SqlDataAdapter ada=null;
  12.             try
  13.             {
  14.                 con.Open();
  15.                 ada = new SqlDataAdapter(cmd);
  16.                 ada.Fill(dt);
  17.                 Byte[] bytes = (Byte[])dt.Rows[0]["Photo"];
  18.                 context.Response.BinaryWrite(bytes);
  19.             }
  20.             catch
  21.             {
  22.                 dt = null;
  23.             }
  24.             finally
  25.             {
  26.                 con.Close();
  27.                 ada.Dispose();
  28.                 con.Dispose();
  29.             }
  30.             if (dt != null)
  31.             {               
  32.                 context.Response.Flush();
  33.                 context.Response.End();
  34.             }
  35.         }
  36.         public bool IsReusable
  37.         {
  38.             get
  39.             {
  40.                 return false;
  41.             }
  42.         }
  43.     }


 
Le code ASP.Net :
 

Code :
  1. <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" CellPadding="4" ForeColor="#333333" GridLines="None">
  2.                 <AlternatingRowStyle BackColor="White" />
  3.                 <Columns>
  4.                     <asp:BoundField DataField="Intitule" HeaderText="Intitule" SortExpression="Intitule" />
  5.                     <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
  6.                     <asp:BoundField DataField="Prix" HeaderText="Prix" SortExpression="Prix" />
  7.                     <asp:ImageField DataImageUrlField="Photo" DataImageUrlFormatString="ImageHandler.ashx?Photo={0}" HeaderText="Photo">
  8.                     </asp:ImageField>
  9.                 </Columns>
  10.                 <EditRowStyle BackColor="#7C6F57" />
  11.                 <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
  12.                 <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
  13.                 <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
  14.                 <RowStyle BackColor="#E3EAEB" />
  15.                 <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
  16.                 <SortedAscendingCellStyle BackColor="#F8FAFA" />
  17.                 <SortedAscendingHeaderStyle BackColor="#246B61" />
  18.                 <SortedDescendingCellStyle BackColor="#D4DFE1" />
  19.                 <SortedDescendingHeaderStyle BackColor="#15524A" />
  20.             </asp:GridView>


 
 
Pfiouuu, j'en ai mis du temps...  :whistle:


Message édité par mikekine le 14-07-2017 à 15:36:45
n°2303383
mikekine
Posté le 14-07-2017 à 20:50:21  profilanswer
 

Là, je tombe sur un problème naze mais qui m'em... bien  :D  
 
Quand je veux pouvoir lire une variable du code behind depuis un fichier aspx, normalement, on fait ceci :
 
 
C# :
 

Code :
  1. protected Int32 mavar = 0;


 
aspx :
 

Code :
  1. blabla="<%=mavar%>"

 
 
 
Pourquoi ça coince chez moi ? [:zytrasnif]
 
 
EDIT : Je vais préciser en disant que ça ne fonctionne pas dans le cas où je dois mettre  
 

Code :
  1. <%=mavar%>


 
entre paranthèses !


Message édité par mikekine le 14-07-2017 à 21:00:23
n°2303384
TotalRecal​l
Posté le 14-07-2017 à 21:14:08  profilanswer
 

Version courte : ta variable doit être public, pas protected.
 
Et c'est pas clean de générer ton html comme ça.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303385
mikekine
Posté le 14-07-2017 à 21:16:12  profilanswer
 

TotalRecall a écrit :

Version courte : ta variable doit être public, pas protected.


 
Si on peut plus se fier à ce qu'on lit sur le web  [:hotcat]

n°2303386
TotalRecal​l
Posté le 14-07-2017 à 21:17:36  profilanswer
 

En fait, j'ai un petit doute, je me demande si en protected c'est pas senser fonctionner [:gratgrat]. Teste :o


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303387
mikekine
Posté le 14-07-2017 à 21:21:47  profilanswer
 

Mais sinon, en quoi cette ligne est-elle incorrecte ?  
 

Code :
  1. <asp:ImageField DataImageUrlField="Photo" DataImageUrlFormatString='ImageHandler.ashx?Photo={0}&MonId=<%=dplid%>' HeaderText="Photo">


 
Je parle surtout de ce passage : <%=dplid%>
 
sachant que dans le code behind :
 

Code :
  1. public Int32 dplid = 0;

n°2303388
TotalRecal​l
Posté le 14-07-2017 à 21:23:53  profilanswer
 

Parce que tu tentes d'évaluer une balise serveur dans une balise serveur ?
Et ce {0} c'est quoi ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303389
mikekine
Posté le 14-07-2017 à 21:25:00  profilanswer
 

TotalRecall a écrit :

Parce que tu tentes d'évaluer une balise serveur dans une balise serveur ?


Et concrètement, je fais quoi ?  :whistle:

n°2303390
TotalRecal​l
Posté le 14-07-2017 à 21:26:18  profilanswer
 

Toi j'sais pas, mais moi j'attaque mon week-end :o


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303391
mikekine
Posté le 14-07-2017 à 21:27:50  profilanswer
 

TotalRecall a écrit :

Toi j'sais pas, mais moi j'attaque mon week-end :o


[:cosmoschtroumpf]
 
 :D

n°2303392
TotalRecal​l
Posté le 14-07-2017 à 21:29:07  profilanswer
 

Sinon je te donne un petit indice, mais ça va t'obliger à revoir une partie de ton bordel : plutôt qu'essayer de faire rentrer dans ton aspx toute la construction de ton gridview, tu peux en traiter une partie (notamment tout ce qui demande de bidouiller des contrôles) en code behind. Pour ça il faut s'abonner à l'événement "OnRowDataBound" ou un truc comme ça de mémoire, demande à google.


Message édité par TotalRecall le 14-07-2017 à 21:29:21

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2303415
mikekine
Posté le 15-07-2017 à 17:40:05  profilanswer
 

Tiens, j'ai une question en passant...  
 
Dans cette procédure :
 

Code :
  1. ALTER procedure [dbo].[AllIntituleArticleparPers]
  2. @Id_Pers int
  3. as
  4. select P.Id_Personne, A.Intitule, A.Description, A.Prix, A.Photo
  5. FROM Articles as A
  6. inner join Listes as L
  7. on A.Id_Liste = L.Id_Liste
  8. inner join Personnes as P
  9. on L.Id_Personne = P.Id_Personne
  10. where P.Id_Personne = @Id_Pers


 
Y'a qqch qui vous titille ou pas ? Dans SQL Management Studio, tout est ok et ça retourne un résultat correct. Par contre, dans Visual Studio, l'analyseur de requête me balance une erreur (en relation avec le tout 1er "P.Id_Personne" ) :
 
https://img4.hostingpics.net/pics/151043200.png
 
Ca vous parle ?  :??:  

n°2304027
mikekine
Posté le 31-07-2017 à 13:17:28  profilanswer
 

Me revoilà !  :)  
 
Mon appli est terminée et fonctionne correctement... Ouf !  :o  
Pour la mise en ligne, j'ai pris la décision que tout se ferait à partir de mon PC (pas d'hébergement externe). Mais je suis tout à fait novice dans ce domaine.  
J'ai cru comprendre qu'il fallait utiliser IIS Express. Est-ce que c'est facile à configurer ? Quels sont les risques ? Est-ce que ce site vous semble un bon début ?
 
Merci !  :jap:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
changer une Url avecTapestry 5.1Aide pour URL activer bouton de reboot
Affichier plusieurs URL à la suite dans une même pageURL sans le GET
Url Rewriting - RegexID dans l'URL conviviale PrestaShop
Recuperer l'URL d'un spreadsheet et l'envoyer par mailRécupérer variable d'une URL dans un VBS
Avoir une partie d'URL"AutoLoging" pour le site https://resu.bionyval84.fr via une URL ?
Plus de sujets relatifs à : [ASP.NET] Bizarrerie avec les URL (ne correspondent pas !)



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR