252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Ciao a tutti,
sono un neofita che nel tempo libero cerca di imparare qualcosa di asp.net, quindi mi scuserete se magari utilizzo tecniche non adatte.
Sto facendo una pagina aspx dove al page_load vado a riempire un da Repater.
In questo esercizio ho dei Command di sql e non sistemi più semplici come linq perchè mi stavo esercitando sui command e anche perchè poi questa cosa che ora vi chiedo mi immaginavo che sarebbe stata ancora più difficile.
Nel mio page_load richiamo una funzione che mi va a tirare fuori i dati dal database
Fino a qui tutto ok.
La domanda è questa,posso passare un valore ottenuto da javascript alla select che ho nella funzione.
Per esempio mettiamo che ottengo le coordinate del utente tramite il browser e queste le voglio usare per fare la select, come posso fare?

questo di sotto è il codice molto semplice che ho utilizzato
a questa select * from foto vorrei passare dei valori che non ho tramite aspx ma che ottengo da javascript.
se nel page_load non fosse possibile potrei anche fare un altra funzione che magari chiamo dopo un pò di tempo (se si può fare)

Avete qualche suggerimento?
Grazie




 protected void Page_Load(object sender, EventArgs e)
    {
        if(!this.IsPostBack)
        {

            DataTable dt = this.Getdata("select * from foto");
            rptMarkers.DataSource = dt;
            rptMarkers.DataBind();


        }
            
    }


    private DataTable Getdata(string query)
    {
        string connString = ConfigurationManager.ConnectionStrings["MiaConnectionString"].ConnectionString;
        SqlCommand cmd = new SqlCommand(query);
        using (SqlConnection con = new SqlConnection(connString))
          

        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            sda.SelectCommand = cmd;
            using (DataTable dt = new DataTable())
            {
                sda.Fill(dt);
                return dt;

            }

        }



***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Per esempio mettiamo che ottengo le coordinate del utente tramite il browser e queste le voglio usare per fare la select, come posso fare?

Puoi copiare le coordinate in uno o più campi asp:HiddenField che hai nella pagina. Poi, quando l'utente clicca un bottone per avviare la ricerca, potrai recuperare quei valori dagli HiddenField.

Supponiamo che la tua pagina sia così:
    <form id="form1" runat="server">
    <div>
        <asp:HiddenField ID="latitudine" runat="server" />
        <asp:HiddenField ID="longitudine" runat="server" />
        <asp:Button runat="server" Text="Cerca" />
    </div>
    </form>
    <script>
        //Ottengo le coordinate via javascript e le copio negli hidden field
        navigator.geolocation.getCurrentPosition(function (position) {
            document.getElementById("<%= latitudine.ClientID %>").value = position.coords.latitude;
            document.getElementById("<%= longitudine.ClientID %>").value = position.coords.longitude;
        });
    </script>

Quando l'utente clicca il tasto "Cerca", si scatenerà il postback. Lato server, recupera i valori di latitudine e longitudine in questo modo:
protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                //leggo i valori dagli hidden field
                var lat = latitudine.Value;
                var lon = longitudine.Value;
                //qui usa lat e lon in qualche modo
            }
        }

Attenzione quando usi valori che arrivano dal client in una query SQL. Se un utente malintenzionato ti altera il contenuto degli HiddenField, potrebbe causarti seri problemi con la SQL injection.

Usa sempre dei SqlParameter per indicare dei parametri da usare nella query (come la latitudine e longitudine).
http://csharp-station.com/Tutorial/AdoDotNet/Lesson06

ciao,
Moreno

Enjoy learning and just keep making
252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Ciao Moreno,
grazie per avermi risposto e per i link che mi hai dato.
Per ora sto usando sempre slqparameter.
Normalmente in asp(classic) ho una funzione che richiamo per ogni request che mi verifica se qualche dato è del tipo injection
Tu pensi che con il parameter non ci sia bisogno?

Tornando all'esercizio invece mi sembra di capire che sul page_load non lo posso fare
Posso magari richiamare il click su quel cerca con una funzione di javascript al caricamento della pagina ?
esiste per caso qualcosa in c# che a fine caricamento pagina richiama una funzione?

Grazie

***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Tu pensi che con il parameter non ci sia bisogno?

Già, non c'è bisogno della funzione perché c'è già il SqlParameter che si occupa sanitizzare l'input, rendendolo inoffensivo.


Posso magari richiamare il click su quel cerca con una funzione di javascript al caricamento della pagina ?

Sì, i bottoni hanno un metodo .click() che puoi invocare via javascript. Per esempio, supponiamo che il bottone Cerca abbia un id="cerca". Per cliccarlo programmaticamente da javascript, prova a fare:
document.getElementById("<%= cerca.ClientID %>").click();

Ecco un altro esempio:
http://www.w3schools.com/jsref/met_html_click.asp


esiste per caso qualcosa in c# che a fine caricamento pagina richiama una funzione?

Sì, esiste il metodo RegisterStartupScript, ecco la documentazione:
https://msdn.microsoft.com/it-it/library/asz8zsxy(v=vs.110).aspx

Tutte queste cose che ti ho presentato però le considero un po' degli artifici. Se sei agli inizi, non ti conviene imparare direttamente lo sviluppo di applicazioni moderne con ASP.NET MVC e l'uso di ajax per dialogare tra client e server?

ciao,
Moreno
Modificato da BrightSoul il 25 novembre 2016 21.14 -

Enjoy learning and just keep making
252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Purtroppo sto avendo un pò di problemi, tant'è che sto pensando che forse concettualmente ho sbagliato proprio a fare lo script.
Infatti il javascript che utilizzo va al caricamento della pagina a prendere delle coordinate per creare dei markers che io volevo scrivere stesso nello script sul page_load, cosa che sono riuscito a fare se quando vado a creare questi markers non ho bisogno prima di prendere le coordiante locali del browser per filtrare nella query che mi ritorna i marker solo determinati punti.
Per aggiungere questi markers nel javascript come detto avevo aggiunto un repeater.
Avendo quindi bisogno di prendere prima le coordinate e poi lanciare la funzione per riempire il repeater ho pensato di fare questo.
Un primo script che mi prende le coordinate e le mette come da tuo suggerimento in due campi hidden.
A questo punto metto un button (per ora visibile) che vado a richiamare con il metodo c# .click una volta prese le coordinate locali del browser.
Poi finito il popolamento del repeater vorrei richiamare il javascript che mostra la mappa avendo adesso dentro quei makers. Per fare questo ho messo un altro button che richiama il javascript per crare la mappa
Per testare tutto ho fatto prima l'azione manuale sui tasti. Tutto mi funziona
Se invece vado a mettere alla fine dello script che mi prende le coordinate del browser questo
document.getElementById("Button1").click();
ottengo un loop infinito
la pagina si refrescia continuamente come se fossero un infinità si submit
naturalmente non ho la possibilità di cliccare sul tasto per mostrare la mappa.

Come detto sto pensando di passare ad un'altra soluzione
ovvero usare uno script che mi popoli la mappa tramite xml.

<script type="text/javascript">
currentdata=new Date();
var datatime=currentdata.getTime();
var map;
var geoXml = new GGeoXml("http://www.dominio.com/feed.xml?"+datatime);

function load() {
  if (GBrowserIsCompatible()) {
  map = new GMap2(document.getElementById("map")); 
  map.addControl(new GLargeMapControl());
  map.setCenter(new GLatLng(41.854549,12.585651), 11); 
  map.addControl(new GLargeMapControl());
  map.addOverlay(geoXml);
  }
} 
</script>


Prima di fare questo anche per capire come risolvere queste cose, vi chiedo, sto sbagliando qualcosa o concettualmente non è corretto quello che volevo fare?
Grazie

***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
penso che esista una soluzione molto più semplice perché vedo troppi rimbalzi tra client e server.
Per cortesia, ripetimi il tuo obiettivo: vuoi fare in modo che al caricamento della pagina si visualizzi un marker su una mappa con la posizione attuale dell'utente?

Se è così, si può risolvere unicamente con codice javascript lato client. Ecco questo primo passo realizzato:
https://jsfiddle.net/4c0secjk/

A questo punto hai la necessità di inviare le coordinate al server? In quel caso le puoi copiare in campi hidden come vedevi prima, oppure inviarle con una richiesta ajax.

ciao,
Moreno

Enjoy learning and just keep making
252 messaggi dal 03 dicembre 2001
www.fuossbook.it
Ciao Moreno e ciao a tutti,
praticamente quello che voglio ottenere è una mappa con dei markers , centrata sulla mia attuale posizione. (ci tengo a dire che è un esercitazione quindi forse ho preso un argomento difficile ma ci sono diversi punti dentro che vorrei capire come risolvere)
I markers li tiro fuori dal mio db.
Fino a che centro la mappa e tiro fuori i punti sul page_load senza eseguire nessuna where al database è tutto ok.
Quello che ora sto provando a fare è passare al database le mie coordinate per filtrare solo i markers vicino a me.
Per fare questo dovrei passare al page_load le mie coordinate, dico al page_laod perchè attualmente io li dentro ho riempito il repeater.
Per avere le coordinate però c'è bisongo che il browser me le passi, e questo avviene purtroppo solo al caricamento della pagina.
Quindi ho pensato di :
1) prendere le coordinate del browser
2) richiamare una funnzione c# che prende le coordinate, esegue la where e popola il repeater (che mi pare di capire posso chimare solo su un click di un button
3) lanciare una funzione js per mostrare la mappa con le mie coordiante e i markers

Come puoi vedere dallo script qui sotto all'interno del javascript ho inserito il repeater quindi quando richiamo cliccaTastoCaricaDati clicco virtualmente sul button che lancia la mia funzione c# per popolarlo.
Il problema e che il button genera un submit che quindi ricarica la pagina e riparte il tutto andando a creare un ciclo infinito

Spero di essere stato più chiaro, come detto....onestamente non so se nella pratica è fattibile eseguire questi passaggi...questo è il motivo principale perchè sto facendo degli esercizi di questo tipo
Grazie

        <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&key=AIzaSyAELIzBDp8lDdOhkIoUQ994I82K85mulWc"></script>
    <script  type="text/javascript">
        var markers = [
             <asp:Repeater runat="server" ID="rptMarkers">
    <ItemTemplate>

        {
            "title": "<%# Eval("indirizzo") %>",
            "lat": "<%# Eval("lat") %>",
            "lng": "<%# Eval("long") %>",
            "description": "<%# Eval("indirizzo") %><img src='/fossi-buchi/<%# Eval("nomeFile") %>'>"
        }

    </ItemTemplate>    
        <SeparatorTemplate>
            ,

        </SeparatorTemplate>

    </asp:Repeater>

        ]

    </script>

          <script type="text/javascript">
   


              function Geolocalizza()
                {
                  if (navigator.geolocation) {
                    navigator.geolocation.getCurrentPosition(mia_posizione,error_callback, { enableHighAccuracy: false });
                  }else{
                    alert('La geo-localizzazione NON è possibile');
                  }
                }
        
                    var lat,lon
        
                    function mia_posizione(position) {
                       lat = position.coords.latitude;
                       lon = position.coords.longitude;
                       origine=lat +","+lon
                               alert(lat + "" + lon)

                       document.getElementById("LatitudineClient").value = lat
                       document.getElementById("LongitudineClient").value = lon
                   
                       /////// chiamo una funzione che mi preme il tasto sul quale ho il popolamento del repater

                        cliccaTastoCaricaDati(); 



                    }
                function error_callback(){
  
                }


                    
                function cliccaTastoCaricaDati()
                {
                        
                        alert("tasto carica dati")
                        document.getElementById("Button1").click();
                        alert("dati caricati")

                }


                function CreaMappa()
                {
        
                        alert("creo mappa")
                        
                    var mapOptions = {
                        center: new google.maps.LatLng(lat,lon),
                        zoom: 12,
                        mapTypeId: google.maps.MapTypeId.ROADMAP
                    };
                    var infoWindow = new google.maps.InfoWindow();
                    var map = new google.maps.Map(document.getElementById("dvMap"), mapOptions);
                    for (i = 0; i < markers.length; i++) {
                        var data = markers[i]
                        var myLatlng = new google.maps.LatLng(data.lat, data.lng);
                        var marker = new google.maps.Marker({
                            position: myLatlng,
                            map: map,
                            title: data.title
                        });
                        (function (marker, data) {
                            google.maps.event.addListener(marker, "click", function (e) {
                                infoWindow.setContent(data.description);
                                infoWindow.open(map, marker);
                            });
                        })(marker, data);
                    }

                }


              ///////// qui inizio tutto prendendo le coordinate del browser
                Geolocalizza()


</script>




***************************
webmaster di:
hydrasail.blogspot.it
fuossbook.it
***************************
59 messaggi dal 17 maggio 2010
Ciao,
ti butto giù un esempio:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="WebApplication.test" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&key=AIzaSyAELIzBDp8lDdOhkIoUQ994I82K85mulWc"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    
    <title></title>
</head>
<body onload="">
    <form id="form1" runat="server">
        <div style="width:500px; height:300px" id="map"></div>
    </form>    
    <button onclick="caricaDati()">Carica Dati</button>
    <script>
        var infoWindow = new google.maps.InfoWindow();
        var markers = [];
        var map;
        var lat = 0;
        var lon = 0;
        var mapOptions = {
            center: new google.maps.LatLng(lat, lon),
            zoom: 12,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map"), mapOptions);
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(getPosition, alert);
        }
        function getPosition(actualPosition) {
            //imposto la posizione attuale
            lat = actualPosition.coords.latitude;
            lon = actualPosition.coords.longitude;
            //centro la mappa sulla posizione attuale
            map.setCenter(new google.maps.LatLng(lat, lon));
            //imposto lo zoom
            map.setZoom(8);
            //carico i dati relativi alla posizione.
            caricaDati();
        } 
        function caricaDati() {
            //richiamo le coordinate sul server passando la posizione attuale
            $.ajax({
                //chiamata di tipo POST
                type: "POST",
                //indirizzo composto dal nome della pagina piu il nome del metodo
                url: "test.aspx/CaricaDati",
                //tipo dati json
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                //passo i parametri post 
                data: "{'posizione':{'Lat':" + lat + ",'Lon':" + lon + "}}",
                cache: false,
                success: function (result) { impostaMarkers(result.d);},
                failure: function (error) { alert(error.d); }
            });
        }
        function impostaMarkers(coordinate) {
            //cancello i vecchi markers
            for (var i = 0; i < markers.length; i++) {
                markers[i].setMap(null);
            }
            markers = [];
            //itero tutte le coordinate ricevute
            var latLon;
            $.each(coordinate, function (index, item) {
                //creo il marker a partire dalla coordinata restituita
                latLon = new google.maps.LatLng(item.Lat, item.Lon);
                var marker = new google.maps.Marker({
                    position: latLon,
                    type: 'info',
                    map: map,
                    title: item.Titolo
                });
                markers.push(marker);
                google.maps.event.addListener(marker, "click", function (e) {
                    infoWindow.setContent(item.Titolo);
                    infoWindow.open(map, marker);
                });
                //solo per test: sposto la posizione all'ultima coordinata ricevuta
                lat = item.Lat;
                lon = item.Lon;
            });
        }
</script>
</body>
</html>



using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using System.Globalization;

namespace WebApplication
{
    public partial class test : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }

        [System.Web.Services.WebMethod]
        public static Coordinata[] CaricaDati(Coordinata posizione)
        {
            List<Coordinata> result = new List<Coordinata>();
            for(int i = 0; i <5;i++)
            {
                result.Add(new Coordinata() { Lat = posizione.Lat + (i + 0.10) * 0.10, Lon = posizione.Lon + (i - 0.10) * -0.10, Titolo=string.Format("Marker {0}",i+1) });
            }
            return result.ToArray();
        }
    }

    public class Coordinata
    {
        public double Lat { get; set; }
        public double Lon { get; set; }
        public string Titolo { get; set; }
    }
}


in pratica non faccio altro che chiamare il metoto statico CaricaDati della pagina test.aspx tramite ajax, alla quale passo la posizione attuale e mi restituisce delle coordinate fittizie che imposto come markers nella mappa.
Modificato da u235 il 29 novembre 2016 19.37 -
Modificato da u235 il 29 novembre 2016 19.47 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.