Nel precedente script abbiamo esaminato gli Spatial Types di SQL Server, allo scopo di rappresentare meglio le nostre entità su mappe e di migliorarne la ricerca geografica.
Nel momento in cui riceviamo dal client una stringa nel formato Well-Known Text (https://it.wikipedia.org/wiki/Well-Known_Text]), avremo la necessità di convertirla in un oggetto di tipo DbGeography, affinché lo si possa utilizzare direttamente in una delle nostre query LINQ to Entities.
Per evitare di ripetere più volte la logica di costruzione, realizziamo un Model Binder personalizzato. Iniziamo scrivendo una classe che implementi l'interfaccia System.Web.Mvc.IModelBinder.
public class DbGeographyModelBinder : IModelBinder { public bool BindModel( ModelBindingExecutionContext modelBindingExecutionContext, ModelBindingContext bindingContext) { var values = bindingContext.ValueProvider.GetValue( bindingContext.ModelName); var rawValue = (string)values.RawValue; try { //Costruiamo l'oggetto usando il sistema geodetico WGS84 bindingContext.Model = DbGeography.FromText(rawValue, 4326); return true; } catch { return false; } } }
Ora che abbiamo a disposizione questa classe, possiamo indicarne il tipo in combinazione con il ModelBinderAttribute per annotare i parametri delle action di un'applicazione ASP.NET MVC.
public async Task<ActionResult> CercaComuni( [ModelBinder(typeof(DbGeographyModelBinder))] DbGeography forma){ //Qui ricerca geografica }
Il client potrà così invocare questa action fornendo la stringa Well-Known Text via querystring, nel modo seguente:
http://hostname/NomeController/CercaComuni?forma=POINT(12.4833 41.9)
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare i WebSocket con Azure API Management
Parallelizzare le chiamate HTTP con async/await e le Promise in JavaScript
Velocizzare l'installazione delle dipendenze in un workflow di GitHub
Leggere la configurazione da Azure KeyVault con logica di retry in ASP.NET Core
Eseguire chiamate hedging gRPC con ASP.NET Core 6
Effettuare update massivi con Entity Framework Core 7
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7
Leggere il valore di un header della richiesta in ASP.NET Core 6
Gestire dati sensibili nella configurazione in ASP.NET Core
Gestire la query string nell'output cache di ASP.NET Core
Taggare automaticamente un repository con un workflow di GitHub
I più letti di oggi
- Effettuare il download di un file via FTP con la libreria FluentFTP di .NET
- Sfruttare la local cache del browser tramite gli ETag in #aspnetcore https://aspit.co/cfc di @crad77 #webapi #aspnetmvc #blazor #cache
- Chiamare direttamente un numero di telefono con HTML5
- Catturare la telemetria degli eventi di output cache in ASP.NET Core
- Workflow di continuous deployment tramite pull request label in GitHub