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
Cambiare la chiave di partizionamento di Azure Cosmos DB
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Paginare i risultati con QuickGrid in Blazor
Usare il versioning con i controller di ASP.NET Core Web API
Implementare il throttling in ASP.NET Core
Load test di ASP.NET Core con k6
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Configurare dependabot per aggiornare le dipendenze di terze parti con GitHub Actions
Generare file PDF da Blazor WebAssembly con iText
Reactive form tipizzati con modellazione del FormBuilder in Angular