Visualizzazione post con etichetta c#. Mostra tutti i post
Visualizzazione post con etichetta c#. Mostra tutti i post

venerdì 23 settembre 2022

Caricare una DropDownList con MVC C#

Esempio di un caricamento di una DropDownList in MVC C# partendo dal relativo Controller (file.cs).
In questo caso carico la dropdownlist del pagesize, ossia quanti dati mosterò a video ad esempio su di una grid.

Parte relativa al back-end

public ActionResult Index()
{
  LoadItem();
}

private void LoadItem()
{
	ViewData["offsetlist"] = new List {
		new SelectListItem { Text = "5", Value = "5" },
		new SelectListItem { Text = "10", Value = "10" },
		new SelectListItem { Text = "15", Value = "15" },
		new SelectListItem { Text = "50", Value = "50" }
	};
}

Nella View del file csthml inserire la seguente sintassi:

@Html.DropDownList("pagesize",
(ViewData["offsetlist"] as IEnumerable), "Page Size"
  , new { @class = "form-control", onchange = "this.form.submit()" })
}

lunedì 19 settembre 2022

Apertura o Download di un file pdf già creato con MVC C#

In questo esempio è possibile aprire e poi scaricare un file pdf da un sito creato con MVC c#.
Nella View inserire la seguente sintassi che permetterà il download del file.


<a class="text-default" href="@Url.Action("PdfGuide", "Home")" 
target="_blank" title="Download guide"> <i class="dropdown-icon fe fe-help-circle"></i> </a>


Parte relativa al back-end, inserire il file pdf sotto la root del progetto ~/assets/help (se non esiste la dir crearne una nuova)

public FileResult PdfGuide()
{
	//include the .pdf extention at the end
	string path = Server.MapPath(String.Format("~/assets/help/guide.pdf"));

	string mime = MimeMapping.GetMimeMapping(path);

	return File(path, mime);
}

lunedì 9 luglio 2018

Invio email tramite l'oggetto MailMessage in c#

In questo esempio si può inviare un'email tramite librerie che mette a disposizione il framework .Net utilizzando il linguaggio c#.
Si può utilizzare questo metodo passando come argomenti il mittente, l'oggetto dell'email, il corpo del messaggio, una stringa di una serie di destinatari separati da una virgola e infine il parametro smtp del server:

public static void SendMailMessage(string mailSender, string obj, string msg,
string recipients, string smtpserver)
{
 try { 
  MailMessage mailMessage = new MailMessage();
  MailAddress sender = new MailAddress(mailSender);
  foreach (string email in recipients.Split(",".ToCharArray()))
  {
   mailMessage.To.Add(email);
  }
  mailMessage.From = sender;
  mailMessage.Subject = obj;
  mailMessage.Body = msg; 
  SmtpClient server = new SmtpClient(smtpserver);   
  server.Send(mailMessage);     
  mailMessage.Dispose();
  server = null;
 }
 catch (Exception e)
 {
  //some code here
 }
}

lunedì 2 luglio 2018

Comprimere file in formato zip con c#

Un modo per comprimere dei file in formato zip con linguaggio c#, è quello di di utilizzare la libreria DotNetZip
disponibile su DotNetZip
Componente abbastanza valido perchè sono riuscito a comprimere un file uguale o inferiore a 2.5 Gb utilizzando DotNetZip, una libreria gratuita.
Per utilizzare questo esempio bisognerà scaricare la libreria e importarla nella solution di Visual Studio come una classica dll (tasto dx e add reference).

 
try
{
 using (ZipFile zip = new ZipFile())
  {
   zip.ParallelDeflateThreshold = -1; 
   zip.AddFile("c:\test1.doc", ""); //example file
   zip.AddFile("c:\test2.txt", ""); //example file
   //....other files
   zip.Save("c:\dirzip\test_zip.zip"); //example dir and file
  }
 }
catch (ZipException e)
{
 //some code here
}

lunedì 25 giugno 2018

Lettura riga per riga di un file di testo in c#

Un altro modo per leggere un file di testo in c# è creare un oggetto StreamReader e analizzare ogni riga in un ciclo while come fatto in questo esempio:

StreamReader reader = new StreamReader(File.OpenRead("c:\test.txt"));
try
{
 while (!reader.EndOfStream)
 {
  var line = reader.ReadLine();  
 }
}
catch (Exception ex)
{
 //code here
}
finally
{
 reader.Close();
}

sabato 19 maggio 2018

Accesso al database Oracle tramite c#

Piccolo esempio che illustra un accesso al database Oracle tramite statement e una restituzione del numero di record presenti sulla tabella Authors in c#.
E' stato utilizzata la libreria OracleClient da referenziare nel progetto .Net in Visual Studio

//using System.Data.OracleClient;

private static void testConnectionDB()
{
OracleConnection conn = new OracleConnection(oraConn);
int intRecord = 0;
string str1="Florence";
string str2="Italy";
try
{
 conn.Open();
 OracleCommand cmd = conn.CreateCommand();

 cmd.CommandType = CommandType.Text;
 cmd.CommandText = "select count(*) as numAuthors from Authors where field1 =:strField1 and field2 =:strField2";

 cmd.Parameters.AddWithValue("strField1", str1);
 cmd.Parameters.AddWithValue("strField2", str2);

 intRecord = Convert.ToInt32(cmd.ExecuteScalar()); 
  
}
catch (Exception ex)
{
 log.Error(ex.Message);
}
finally
{
   cmd.Dispose();

   if (conn.State != ConnectionState.Closed)
   {
    conn.Close();
   }
}

venerdì 9 marzo 2018

Chiamare un web service in modalità asincrona e sincrona in c#

Il seguente esempio è una chiamata ad un metodo di un web service in c# con una risposta in modalità sincrona o asincrona.

Decommentando la parte di wait response si potrà attendere l'esito, altrimenti verrà restituito un risultato mentre l'elaborazione sarà in corso.
public class ServiceExample : System.Web.Services.WebService
    {
 private delegate string AsyncMethodCallerCreateZip(string idArticle, out string outResult);
  
 [WebMethod(Description = "An example")]
 public string FirstElaboration(string idArticle)
 {
  try
  {
   //Async call
   AsyncMethodCallerCreateZip caller = new AsyncMethodCallerCreateZip(CreateZip);
   IAsyncResult result = caller.BeginInvoke(idArticle, out outResult, null, null);

   //wait response
   //result.AsyncWaitHandle.WaitOne();
   //string returnValue = caller.EndInvoke(out outResult, result);
   //result.AsyncWaitHandle.Close();
   //return returnValue;

   return "OK";
  }
  catch (Exception ex)
  {
   return "KO";
  }
 }

 public string CreateZip(string idArticle, out string outResp)
 {
  //code here
  return outResp;
 }
}

giovedì 5 maggio 2016

WebService gratuiti per valute e Bitcoin con c#

Ero alla ricerca di alcuni WebService o API gratuite (difficili a trovarli, spesso 'api' a pagamento oppure previa registrazione) con cadenza giornaliera, per avere una tabella delle valute del database sempre aggiornata.
Quindi dovevo trovare importi in sterline, yen, dollari e soprattutto Bitcoin (avere una stima) pronti ad essere convertiti in Euro.
L'esempio seguente mostra come aggiornare le valute in una tabella (Tab_Valuta) calcolando poi il corrispettivo in Euro.
I link scelti per le valute e Bitcoin sono: http://www.ecb.europa.eu e https://cex.io
Navigando su questi siti si possono vedere meglio le modalità di richiamo dei vari servizi.
Altri link utili (ma bisogna registrarsi per lavorare con le API) sono https://it.bitstamp.net/ e https://btc-e.com/
N.B. Ho portato tutto in tipo stringa perchè possono esserci problemi con i decimali e quindi con il tipo internazionale delle valute scelto sul server.

class Program
{
static string dollar = "0";
static string gbp = "0";
static string yen = "0";
static string btc = "0";

static void Main(string[] args)
{
Conversion();
UpdateCurrency();
}

private static void UpdateCurrency()
{
  string SQL = "";
  if(Convert.ToDouble(dollaro)>0)
  SQL += "update Tab_Valuta set Cambio=cast('" + dollar + "' as numeric(18,5)) where id_valuta=1; ";

  if (Convert.ToDouble(sterlina) > 0)
  SQL += "update Tab_Valuta set Cambio=cast('" + gbp + "' as numeric(18,5)) where id_valuta=3; ";

  if (Convert.ToDouble(yen) > 0)
  SQL += "update Tab_Valuta set Cambio=cast('" + yen + "' as numeric(18,5)) where id_valuta=4;";

  if (Convert.ToDouble(btc) > 0)
  SQL += "update Tab_Valuta set Cambio=cast('" + btc + "' as numeric(18,5)) where id_valuta=5;";

  SqlConnection con = new SqlConnection();
  try
  {
    string dbConString = ConfigurationManager.ConnectionStrings["ConnectionDB"].ConnectionString;

    con.ConnectionString = dbConString;
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = SQL;
    cmd.ExecuteNonQuery();
  }
  catch (Exception ex)
  {
  }
  finally
  {
  con.Close();
  }
}

private static void Conversion()
{
XmlDocument doc = new XmlDocument();
try
{
  doc.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

  //normal currency
  foreach (XmlNode node in doc.DocumentElement.ChildNodes)
  {
    foreach (XmlNode locNode in node)
    {
      if (locNode.Name.Equals("Cube"))
      {
        foreach (XmlNode locNode2 in locNode)
        {
            if (locNode2.Attributes["currency"].Value == "USD")
            {
            dollar = locNode2.Attributes["rate"].Value.Replace(",", ".");
            }
            if (locNode2.Attributes["currency"].Value == "GBP")
            {
            gbp = locNode2.Attributes["rate"].Value.Replace(",", ".");
            }
            if (locNode2.Attributes["currency"].Value == "JPY")
            {
            yen = locNode2.Attributes["rate"].Value.Replace(",", ".");
            }
        }
      }
    }
  }
}
catch (Exception ex)
{}

//Bitcoin
using (WebClient wc = new WebClient())
{
var json = wc.DownloadString("https://cex.io/api/last_price/BTC/EUR");
Price m = JsonConvert.DeserializeObject(json);
btc = Convert.ToString( 1 / Convert.ToDouble(m.LPrice));
}
}
}
class Price
{
[JsonProperty("lprice")]
public String LPrice { get; set; }
}

domenica 1 maggio 2016

Leggere un file di log al contrario in c#

In un'applicazione web in ambiente .Net è possibile leggere al contrario un file di log in formato testo (alimentato in modalità 'append'), ossia dalla fine all'inizio.
Può capitare che il file venga utilizzato da un altro processo, in questo esempio copio il file in un altro dello stesso tipo e lo apro per leggerlo.

//Create .aspx file; this is code-behind .cs

protected void Page_Load(object sender, EventArgs e)
{
 strLog = new StringBuilder("");
 try
 {
  //directory log on webapp
  string pathLogOriginale = Server.MapPath("~/logs/log.txt");

  //If the file used by another process, I copy the file and then I read it
  File.Copy(pathLogOriginale, Server.MapPath("~/logs/log_copy.txt"), true);
  string pathLog = Server.MapPath("~/logs/log_copy.txt");

  //example only 100 rows
  foreach (var line in File.ReadLines(pathLog).Reverse().Take(100)) //only the first 100 rows
 	strLog.Append(line+"<br><br>");

  /*
   * use string strLog in .aspx file in label object or text object
   */
 } 
 catch (Exception ex)
 {
 }
}

martedì 26 aprile 2016

Whois API e Free WebService

Ero alla ricerca di api gratuite da utilizzare in un progetto web in ambiente Microsoft .Net e ho trovato questi domini che ne offrono a limitate condizioni.
Praticamente a partire da un url si ottengono informazioni come il proprietario, la scadenza del sito, la localizzazione del server ed altre ancora.
Quindi con un po' di c# e richiamando alcuni web service sono riuscito ad inserire facilmente a catturare questi tipi di dati che normalmente vengono restituiti in formato xml.
Ecco alcuni esempi:
- dal sito www.checkdomain.com utilizzo http://www.checkdomain.com/cgi-bin/checkdomain.pl?domain=

- dal sito www.uwhois.com integro in c# con:
string whoisServer="www.uwhois.com";
TcpClient tcpClinetWhois = new TcpClient(whoisServer, 43);
NetworkStream networkStreamWhois = tcpClinetWhois.GetStream();
BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois);
StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois);
streamWriter.WriteLine(url);
streamWriter.Flush();
StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois);
while (!streamReaderReceive.EndOfStream)
{
//...
}
- dal sito who.godaddy.com utilizzo https://who.godaddy.com/whoisstd.aspx?domain=
ad esempio:
string whoisServer="who.godaddy.com";
Uri absoluteUri = new Uri(whoisServer + url);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(absoluteUri);
- dal sito www.whoisxmlapi.com utilizzo https://www.whoisxmlapi.com/whois-api-doc.php (navigando nel sito è possibile trovare codice per linguaggio c#)

giovedì 31 marzo 2016

GeoChart con c# e Google

In un progetto in ambiente .Net sono facilmente integrabili alcune rappresentazioni geografiche offerte dal servizio Google GeoChart.
Ecco un esempio con linguaggio c# dove vengono rappresentati dei valori per ciascuna nazione in un contesto mondiale.
Questo è il link al servizio offerto da Google: https://developers.google.com/chart/interactive/docs/gallery/geochart#displaying-proportional-markers
Con poche righe di codice html si può scegliere una rappresentazione per Paese, per tutto il mondo oppure per area (ad esempio europea).

//nel sorgente javascript in html
var data = google.visualization.arrayToDataTable( <%=dataChartCountry%>);

//in c#
public string dataChartCountry= "";

int countObj=10;
int countSeq=0;
dataChartCountry = "[['Country', 'Num'],";

foreach (CountryNum countryNum in listCountry)
{
 ++countSeq;
 if (countSeq == countObj)
  dataChartCountry += "['" + countryNum.x + "'," + countryNum.y + "]";
 else
  dataChartCountry += "['" + countryNum.x + "'," + countryNum.y + "],";
}
dataChartCountry += "]";

giovedì 5 novembre 2015

ADOX Class con c# e la versione a 32 bit per creare un database Access mdb

Dopo svariati tentativi sono riuscito ad utilizzare un provider buono che girasse su server a 64bit senza cambiare l'opzione su IIS per "Enable 32-Bit Applications".
Creare tramite codice c# su un applicativo web in .Net un database Access mdb e collegare delle tabelle all'interno non è stata una passeggiata.
Per utilizzare la connessione con Jet.OLEDB bisognava avere per forza questa abilitazione.
Ecco l'errore che usciva su sistema a 64bit:
System.Runtime.InteropServices.COMException (0x80040154): Class not registered at ADOX.CatalogClass.Create

Poi mi sono inbattuto su questo link:
https://social.msdn.microsoft.com/Forums/en-US/1d5c04c7-157f-4955-a14b-41d912d50a64/how-to-fix-error-the-microsoftaceoledb120-provider-is-not-registered-on-the-local-machine?forum=vstsdb
e ho provato a scaricare il motore 2010. Niente da fare ecco l'errore:
"the 'microsoft.ace.oledb.12.0' provider is not registered on the local machine"

Ho scaricato infine l'engine 2007 alla seconda opzione qui
Incredulo e increduli... ha funzionato!
Ovviamente sul server non avevo installato il pacchetto Office, quindi è risultato semplice installare questo pacchetto Microsoft gratuito, che mi ha permesso di creare un database Access e creare all'interno anche tabelle collegate.
Di seguito un esempio di codice che ho utilizzato:

string tFilePath = "c:\example.mdb";
// string MDBConnStr = "Provider=Microsoft.Jet.OLEDB.4.0; data source=" + tFilePath + ";Jet OLEDB:Engine Type=5";

// REPLACE WITH THIS
string MDBConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + tFilePath + ";";

ADOX.CatalogClass tCat = new ADOX.CatalogClass();
ADODB.Connection conAdodb=null;
try
{
 tCat.Create(MDBConnStr);
 conAdodb = (ADODB.Connection)tCat.ActiveConnection;
 
 //..code here, create table, linked table...
 
}catch(Exception ex)
 {
  //...code here
 }
finally {
 //best close
 if (conAdodb != null && conAdodb.State != 0)
  conAdodb.Close();
  
 System.Runtime.InteropServices.Marshal.ReleaseComObject(tCat);
 GC.Collect();
 GC.WaitForPendingFinalizers();
}

mercoledì 1 luglio 2015

Un semplice log in c#

Creare un semplice log in mancanza di componenti terze parti in ambiente .Net con c#.
Ecco un esempio che passa dei parametri ad un metodo e scrive una stringa in modalità "append" su di un file.
private void CreaLog(string strMsg)
{
 System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\temp\\log.txt",true); //true: append
 file.WriteLine(strMsg);

 file.Close();
}

mercoledì 1 ottobre 2014

Problema con la stampa dei grafici tramite Chart del framework .Net

A volte non è possibile stampare con il browser Internet Explorer o Chrome o un altro ancora, una pagina web con dei grafici fatti con il componente Chart del framework .Net perchè alcune proprietà del componente non sono state settate correttamente in fase di sviluppo.
La proprietà da modificare è la "ImageStorageMode" portandola così ad utilizzare un file fisico.
Successivamente verrà settata la proprietà "ImageLocation" con il percorso del file (in questo caso si è creata una directory sul sito e si è dato un nome fittizio all'immagine che ogni volta verrà sovrascritta, volendo dal sito Microsoft è possible utilizzare un asintassi per poter scrivere ogni volta l'immagine in maniera sequenziale).

<asp:CHART id="Chart1"  runat="server" Palette="BrightPastel" BackColor="#D3DFF0" Height="580px" 
Width="560px" BorderlineDashStyle="Solid" BackGradientStyle="TopBottom" BorderWidth="2" ImageStorageMode="UseImageLocation" ImageLocation="~/TempImages/ChartW"
BorderColor="26, 59, 105" IsSoftShadows="False" >

venerdì 19 settembre 2014

Ricerca con Bing Api e c# da una pagina aspx di Microsoft .Net

Con queste semplice esempio è possibile utilizzare le Bing Api tramite c# ed eseguire una ricerca con Bing.
Si può creare ad esempio un pulsante che punti sul metodo e restituisca i risultati su di una listBox e una textBox per inserire la ricerca.
Per curiosità ho inserito nel webConfig l'inidirizzo e la chiave per connettersi a Bing, ma ciò non toglie che si può facilmente inserire nel sorgente c#.
Attualmente per utilizzare le Api di Bing bisogna creare un account Azure (disponibile anche gratuitamente) e farsi dare la chiave di accesso.

Nel file Web.Config inserire le due righe:
<add key="BingKey" value="1231231231231231231321231231231231231231231"/>
<add key="BingUrl" value="https://api.datamarket.azure.com/Bing/Search/"/>

Metodo da richiamare in c#
// Example for only English language research; null= all languages
BingSearch("rent car europe", "en-GB"); 

Codice di esempio da inserire per c#
string bingKey = ConfigurationManager.AppSettings["BingKey"].ToString();
string bingUrl = ConfigurationManager.AppSettings["BingUrl"].ToString();

public void BingSearch(string search_expression, string lang)
{
 try{
  var bingContainer = new Bing.BingSearchContainer(new Uri(bingUrl));
  var accountKey = bingKey;
  bingContainer.Credentials = new NetworkCredential(accountKey, accountKey);
 
  var searchQuery = bingContainer.Web(search_expression, null, null, lang.Equals("")?null:lang, null, null, null, null);
  var varResults = searchQuery.Execute();

  foreach (var result in varResults)
  {
   ....
  }
 }
 catch (Exception ex)
 {}
}

venerdì 5 settembre 2014

Ottenere una pagina web o link con .Net c#

E' possibile ottenere una pagina web in diversi modi con gli elementi a disposizione del framework .Net di Microsoft.
In questi due esempi sono stati utilizzati linguaggio c#, la classe WebClient e la classe HttpWebRequest.
Nel primo esempio la classe WebClient con un semplice metodo ricerca il codice html a partire da un Url.
Nel secondo esempio ho creato un metodo e ho utilizzato la classe HttpWebRequest per la ricerca del codice html sempre a partire da un url/sito utilizzando un user agent di un browser.
Questo secondo esempio è stato creato perchè a volte alcuni siti inibiscono l'accesso e quindi la "cattura" del codice se si proviene con degli applicativi software o "Robot", ma lasciano entrare solamente "visitatori umani".
Viene in aiuto la classe HttpWebRequest con il parametro UserAgent da settare cosicchè l'applicativo potrà "diventare" un "visitatore umano" per questi tipi di siti.
Ma a volte la "cattura" del codice può impiegare più di un tempo previsto standard, per cui si dovranno impostare i vari timeout di risposta.

1 esempio:
string htmlCode="";
string strUrlNew = "http://www.example.com";

using (WebClient client = new WebClient())
{
 htmlCode = client.DownloadString(strUrlNew);
}

2 esempio:
    
private string DownloadContentSite(string url)
{
 string htmlCode = "";
 Byte[] bytes;
 Uri absoluteUri = new Uri(url.Trim());
 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(absoluteUri);
 webRequest.Method = "GET";
 webRequest.AllowAutoRedirect = false;
 webRequest.Timeout = 60000;
 webRequest.ReadWriteTimeout = 60000;
 webRequest.Accept = "*/*";
 webRequest.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)";
 using (WebResponse webResponse = webRequest.GetResponse())
 {
  string contentType = webResponse.ContentType;
  using (Stream stream = webResponse.GetResponseStream())
  {
   using (MemoryStream memoryStream = new MemoryStream())
   {
    Byte[] buffer = new Byte[0x1000];
    Int32 bytesRead;
    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
     memoryStream.Write(buffer, 0, bytesRead);
    }
    bytes = memoryStream.ToArray();
   }
  }
 }

 htmlCode = System.Text.Encoding.UTF8.GetString(bytes);

 return htmlCode;
}

domenica 31 agosto 2014

Ottenere unici item da una lista tipizzata in c#

A volte può capitare di avere una lista tipizzata popolata List<T> con molti valori, nell'esempio seguente la lista di "People", e si vuole escludere i valori duplicati.
In questo caso arriva in aiuto il metodo "Distinct()" del framework .Net che restituisce i valori univoci.
public class People
{
 public string Name;
 public string Surname;
 ...
}

List<People> listPeople = new List<People>();
People people = new People();
people.Name="A";
people.Surname="AAA";
listPeople.Add(people);
...
people = new People();
people.Name="A";
people.Surname="AAA";
listPeople.Add(people);
...
people = new People();
people.Name="B";
people.Surname="BBB";
listPeople.Add(people);
...
var uniquePeople = listPeople.Distinct();

venerdì 22 agosto 2014

Ricerca con Google Api e c# da una pagina aspx

Con queste semplici righe è possibile connettersi alle Google Api tramite c# ed eseguire una ricerca con Google.
Si può creare ad esempio un pulsante che punti sul metodo e restituisca i risultati su di una listBox, una textBox per inserire la ricerca.
Per curiosità ho inserito nel webConfig l'inidirizzo di Google, ma ciò non toglie che si può facilmente inserire nel sorgente c#.
Non dimenticarsi di scaricare la libreria Newtonsoft.Json.dll e inserirla nella directory "bin" dell'applicazione insieme con il file Newtonsoft.Json.xml

//Nel WebConfig inserire l'url delle Google Api
<configuration>
  <appSettings>
  <add key="GoogleUrl" value="http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=2&q={0}&hl={1}&start={2}"/>

  
//Creare ad esempio il Model
public class SearchResultData
{
 public string url;
 public string title;
 public string content;
 public FindingEngine engine;

 public enum FindingEngine { google };

 public SearchResultData(string url, string title, string content, FindingEngine engine)
 {
  this.url = url;
  this.title = title;
  this.content = content;
  this.engine = engine;
 }
}

//Nel sorgente della pagina aspx.cs inserire le seguenti righe 
public string googleUrl = ConfigurationManager.AppSettings["GoogleUrl"].ToString();
 
public List<SearchResultData> GoogleSearch(string search_expression, string lang)
    {
 var url_template = googleUrl;
 if (lang.Equals(""))
  lang = SpiderObj.Languages.Code.codeEN;
 Uri search_url;
 var results_list = new List<SearchResultData>();
 int[] offsets = { 0, 8, 16, 24, 32 };
 try{
  foreach (var offset in offsets)
  {
   search_url = new Uri(string.Format(url_template, search_expression, lang, offset));
   var page = new WebClient().DownloadString(search_url);
   JObject objJson = (JObject)JsonConvert.DeserializeObject(page);

   var results_query =
     from result in objJson["responseData"]["results"].Children()
     select new SearchResultData(
      url: result.Value<string>("url").ToString(),
      title: result.Value<string>("title").ToString(),
      content: result.Value<string>("content").ToString(),
      engine: SearchResultData.FindingEngine.google
      );

   foreach (var result in results_query)
    results_list.Add(result);
  }
 }
 catch (Exception ex)
 {
  log.Error(ex);
  throw new Exception("");
 }
 return results_list;
    }

martedì 24 giugno 2014

Upload di file multipli in .Net con c#

Con poche righe di codice è possibile eseguire upload di file multipli in un sito web su piattaforma .Net con linguaggio c#.
E' molto importante ricordare nel "form" la proprietà enctype="multipart/form-data" e nell'oggetto "input" la proprietà multiple="multiple"
Nell'esempio è presente la parte client/html (Default.aspx), il codice associato (Default.aspx.cs) e le immagini d'aiuto.

Default.aspx
<asp:%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>asp:
<asp:html xmlns="http://www.w3.org/1999/xhtml">asp:
<asp:head runat="server">asp:
    <asp:title>asp:<asp:/title>asp:
<asp:/head>asp:
<asp:body>asp:
    <asp:form id="form1" runat="server" enctype="multipart/form-data"  method="post" >asp:
        <asp:table cellpadding="2" cellspacing="1" width="740px">asp:
            <asp:tr>asp:
                <asp:td width="120px">asp:
                    <asp:input type="file" id="File1" multiple="multiple" name="File1" runat="server" />asp:
                <asp:/td>asp:
            <asp:/tr>asp:
            <asp:tr>asp:
                <asp:td align="left">asp:
                    <asp:asp:Button id="Manual" Text="Upload" runat="server" OnClick="Upload_Click"  />asp:
                <asp:/td>asp:
            <asp:/tr>asp:
            <asp:tr>asp:
                <asp:td colspan="4">asp:
                    <asp:asp:ListBox ID="list_message" name="list_message" runat="server" width="600px" Height="200px">asp:<asp:/asp:ListBox>asp:
                <asp:/td>asp:
            <asp:/tr>asp:
        <asp:/table>asp:
    <asp:/form>asp:
<asp:/body>asp:
<asp:/html>asp:
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
    string pathFileUploaded = "c:\\temp\\";

    protected void Page_Load(object sender, EventArgs e)
    {}
 
    protected void Upload_Click(object sender, System.EventArgs e)
    {
        if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength >asp: 0))
        {
            HttpFileCollection uploadedFiles = Request.Files;
            for (int i = 0; i <asp: uploadedFiles.Count; i++)
            {
                HttpPostedFile userPostedFile = uploadedFiles[i];
                try
                {
                    if (userPostedFile.ContentLength >asp: 0)
                    {
                        string fn = System.IO.Path.GetFileName(userPostedFile.FileName);
                        try
                        {
                            userPostedFile.SaveAs(pathFileUploaded + fn);
                            list_message.Items.Add(userPostedFile.FileName + " inviato.");
                        }
                        catch (Exception ex)
                        {
                           list_message.Items.Add("Errore: " + ex.Message);
                        }
                    }
                }
                catch (Exception Ex)
                {
                   list_message.Items.Add("Errore: " + Ex.Message);
                }
            }
        }
        else
        {
            list_message.Items.Add("Selezionare almeno 1 file.");
        }
    }
}



mercoledì 9 ottobre 2013

Grafici in .Net con il DataVisualization Charting

Dalla versione 4.0 del framework .Net è disponibile un ottimo componente per disegnare grafici, ad esempio, in una pagina aspx.
Per la versione 3.5 invece bisogna scaricarlo dal sito Microsoft. Mi riferisco al componente DataVisualization.Charting che è possibile referenziare in Vistual Studio.
Visual Studio Chart

Di seguito è rappresentato un esempio di come raffigurare dei dati in un grafico a torta.
Grafico a torta

Parametri nel Web.Config
<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" >
          <assemblies>
            <add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          </assemblies>
        </compilation>
      <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
        <controls>
          <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting" assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        </controls>
      </pages>
      <httpHandlers>
        <add path="ChartImg.axd" verb="GET,HEAD,POST"
          type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"  />
      </httpHandlers>
    </system.web>
  <system.webServer>
    <handlers>
      <remove name="ChartImageHandler" />
      <add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST"
       path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  />
    </handlers>
  </system.webServer>
  <appSettings>
    <add key="ChartImageHandler" value="storage=memory;timeout=20;" />
  </appSettings>
</configuration>

Componente Chart nella pagina .aspx
<asp:CHART id="Chart1"  runat="server" Palette="BrightPastel" BackColor="#D3DFF0" Height="330px" 
        Width="530px" BorderlineDashStyle="Solid" BackGradientStyle="TopBottom" BorderWidth="2" 
        BorderColor="26, 59, 105" IsSoftShadows="False" ImageLocation="~/TempImages/ChartPic_#SEQ(300,3)">
        <Titles><asp:Title Alignment="TopRight" Text="CARS" Font="Microsoft Sans Serif, 8pt, style=Bold"></asp:Title></Titles>
      <legends>
       <asp:Legend TitleFont="Microsoft Sans Serif, 8pt, style=Bold" BackColor="Transparent" IsEquallySpacedItems="True" Font="Trebuchet MS, 8pt, style=Bold" IsTextAutoFit="False" Name="Default"></asp:Legend>
      </legends>
      <borderskin SkinStyle="Emboss"></borderskin>
      <series>
       <asp:Series ChartArea="Area1" XValueType="Double" Name="Series1" ChartType="Pie" Font="Trebuchet MS, 8.25pt, style=Bold" 
                CustomProperties="DoughnutRadius=25, PieDrawingStyle=Concave, CollectedLabel=Other, MinimumRelativePieSize=20, CollectedSliceExploded=true" 
                MarkerStyle="Circle" BorderColor="64, 64, 64, 64" Color="180, 65, 140, 240" YValueType="Double" Label="#PERCENT{P1}">
         
       </asp:Series>
      </series>
      <chartareas>
       <asp:ChartArea Name="Area1" BorderColor="64, 64, 64, 64" BackSecondaryColor="Transparent"
                    BackColor="Transparent" ShadowColor="Transparent" BackGradientStyle="TopBottom">
        <axisy2>
         <MajorGrid Enabled="False" />
         <MajorTickMark Enabled="False" />
        </axisy2>
        <axisx2>
         <MajorGrid Enabled="False" />
         <MajorTickMark Enabled="False" />
        </axisx2>
        <area3dstyle PointGapDepth="900" Rotation="162" IsRightAngleAxes="False" WallWidth="25" IsClustered="False" />
        <axisy LineColor="64, 64, 64, 64">
         <LabelStyle Font="Trebuchet MS, 8.25pt, style=Bold" />
         <MajorGrid LineColor="64, 64, 64, 64" Enabled="False" />
         <MajorTickMark Enabled="False" />
        </axisy>
        <axisx LineColor="64, 64, 64, 64">
         <LabelStyle Font="Trebuchet MS, 8.25pt, style=Bold" />
         <MajorGrid LineColor="64, 64, 64, 64" Enabled="False" />
         <MajorTickMark Enabled="False" />
        </axisx>
       </asp:ChartArea>
      </chartareas>
     </asp:CHART>

Codice nel file .cs
public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                PopulateChart();
        }

        protected void PopulateChart()
        {
            long car1 = 10; long car2 = 20; long car3 = 30;

            DataPoint dp1 = new DataPoint();
            dp1.SetValueY(car1);
            dp1.LegendText = "BMW";

            DataPoint dp2 = new DataPoint();
            dp2.SetValueY(car2);
            dp2.LegendText = "Ford";

            DataPoint dp3 = new DataPoint();
            dp3.SetValueY(car3);
            dp3.LegendText = "Volvo";


            this.Chart1.Series["Series1"].Points.Insert(0, dp1);
            this.Chart1.Series["Series1"].Points.Insert(1, dp2);
            this.Chart1.Series["Series1"].Points.Insert(2, dp3);
        }
    }