41 messaggi dal 09 gennaio 2012
Ciao a tutti
Sono uno svilupparore in classic asp e per 13 mi sono fatto , un CMS , decine di gestionali web e tanto altro; prima di buttare la mia valigia di codice, snippet e template in classic asp chiedo a voi un vostro parere esperto.
Dopo alcuni manuali, diversi tutorial, vorrei passare ad asp.net ma non so quale strada imboccare: MVC o Web Form.

Mi rendo conto che per rispondere occorre sapere cosa devo fare:

A) Non mi spaventa scrivere codice e ho la necessità di avere il massimo controllo su CSS, javascript e Html5.
Gli automatismi ben vengano ma non mi devono legare le mani(risparmiare un po di tempo non e' male .. ma non voglio perdere le giornate a scoprire come convicere un controllo data bound a mostrare dei dati non previsti dalla microsoft).

B) Devo sviluppare web app di media complessità (gestionali on line) con db vari : da Mysql, SqlServer, Oracle o Access (se serve...) senza dover riscrivere il codice se cambio il db.
Vorrei fare il porting del mio CMS e per questo il controllo su Html, css e javascript deve essere totale.

Lungi dal voler scatenare un flame su quale tecnologia sia migliore, (sono sicuro che ciascuno ha le sue ragioni) vorrei cominciare ad affrontare problemmi concreti sapendo che se studio e comprendo poi posso personalizzare e raggiungere il mio obiettivo.
Non amo tanto le pappette pronte di cui non conosco il modo di cambiarne gli ingredienti, quando serve. ;-)

grazie per la vostro parere.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
dal tuo post sembra evidente che tu abbia già scelto ASP.NET MVC, e appoggio questa scelta.
Avrai il totale controllo sull'output HTML prodotto dalla tua applicazione, proprio come hai chiesto.

In realtà sarebbe possibile anche con ASP.NET WebForms, ma con quello avresti la tentazione di usare uno dei suoi WebControls, e finiresti col perdere il controllo sull'output.

alvaropetro ha scritto:

da Mysql, SqlServer, Oracle o Access (se serve...) senza dover riscrivere il codice se cambio il db.

Dai un'occhiata ad Entity Framework. Essendo un ORM, introdurrà un livello di astrazione che ti permetterà di interrogare un modello concettuale, anziché direttamente le tabelle del database. In questo modo potrai scegliere uno qualsiasi dei database supportati senza dover cambiare il codice della tua applicazione.

Access non è tra i database supportati. Dovrai casomai usare qualche altro datafile, come SqlCE o Sqlite.

ciao,
Moreno
Modificato da BrightSoul il 07 ottobre 2014 22.23 -

Enjoy learning and just keep making
59 messaggi dal 17 maggio 2010
Ciao,
mi accodo all'ottima risposta di Moreno.
Anche io a livello web provengo dal vecchio asp, e mi sono trovato benissimo anche utilizzando lato server le WebApi, mentre lato client faccio tutto in javascript. Io in genere uso breeze e knockout mettendo i controlli in binding con dei template caricati quando servono, ed in genere faccio SPA, ma volendo puoi anche "caricare" dati in array js (o meglio in observableArray di knockout e diventerà simile a come si fa in asp) ed usare "pagina dopo pagina" (non SPA).
In pratica usando anche ASP.NET (o MVC), se hai i cosiddetti e ti piace avere sotto controllo tutto, allora ti consiglio di non guardare neppure i controlli proposti per quella tipologia, ma di fare direttamente tutto a mano.
Puoi arrivare fino ad usare semplici pagine html (con estensione html) per il lato client.

ti faccio un piccolo esempio :

1) crea un nuovo progetto web vuoto
2) aggiungi una pagina aspx
3) aggiungi tramite nuget Knockout mapping (oppure scaricati tutti i suoi riferimenti a mano)
4)aggiungi tramite nuget jquery (oppure scaricati tutti i suoi riferimenti a mano)
5) aggiungi jquery e knockout + knockout mapping nella pagina
6) apri la pagina aspx.cs e scrivi :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication4
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        [WebMethod]
        public static IEnumerable<Mezzo> GetMezzi()
        {
            return new Mezzo[] { new Mezzo() {ID=0, Nome = "Mezzo 1", Targa = "aa000aa" }, new Mezzo() {ID=1, Nome = "Mezzo 2", Targa = "aa001aa" } }; ;
        }

        [WebMethod]
        public static bool SetMezzo(Mezzo Mezzo)
        {
            //salva qui 
            return true;
        }
    }

    public class Mezzo
    {
        public long ID { get; set; }
        public string Nome { get; set; }
        public string Targa { get; set; }
    }
}

in pratica il codice sopra non fa altro che esporre dei dati arbitrari (GetMezzi) e impostare eventualmente le modifiche ad un elemento passato (SetMezzo)

7) apri la pagina aspx e scrivi :
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication4.WebForm1" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
    <script src="Scripts/jquery-2.1.1.min.js"></script>
    <script src="Scripts/knockout.js"></script>
    <script src="Scripts/knockout.mapping-latest.js"></script>
    <title></title>
</head>
<body>
    <script>
        $(document).ready(function () {
            //creo la variabile da mettere in binding
            var HomeViewModel = {};
            //aggiungo una proprietà che conterrà i Mezzi
            HomeViewModel.Mezzi = ko.observableArray();
            //aggiungo una variabile che conterrà l'elemento selezionato
            HomeViewModel.MezzoSelezionato = ko.observable();
            //aggiungo un comando da mettere in binding con un bottone (o semplicemente col click di un elemento qualsiasi)
            HomeViewModel.Carica = function () {
//carico i mezzi dal server                
GetMezzi();
            };
            HomeViewModel.SalvaMezzo = function () {
                SetMezzo();
            };
            //semplice chiamata ajax
            function GetMezzi() {
                $.ajax({
                    type: "POST",
                    url: "WebForm1.aspx/GetMezzi",
                    data: {},
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    //se la chiamata va a buon fine carico il risultato nella variabile (di tipo observableArray) Mezzi
                    success: function (result) {
                        //carico i risultati in un observableArray
                        HomeViewModel.Mezzi(ko.mapping.fromJS(result.d));
                    },
                    //in caso di errore apparirà un alert
                    error: function (a, reason) {
                        alert(reason);
                    },
                });
            }
            function SetMezzo() {
                var mezzo = HomeViewModel.MezzoSelezionato();
                //imposto il parametro da passare al metodo SetMezzo assegnando il valore del mezzo selezionato (e relative modifiche)
                var parameter = "{'Mezzo': {ID:"+mezzo.ID() +",Nome:'"+mezzo.Nome()+"',Targa:'"+mezzo.Targa()+"'}}";
                $.ajax({
                    type: "POST",
                    url: "WebForm1.aspx/SetMezzo",
                    data: parameter,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    //se la chiamata va a buon fine carico il risultato nella variabile (di tipo observableArray) Mezzi
                    success: function (result) {
                        //HomeViewModel.Mezzi(result.d);
                    },
                    //in caso di errore apparirà un alert
                    error: function (a, reason) {
                        alert(reason);
                    },
                });
            }
            //applico il binding a tutta la pagina
            ko.applyBindings(HomeViewModel);
        });
    </script>
    <div>
        <select data-bind="
    //associo l'array dei mezzi come source
    options: $data.Mezzi(),
    //imposto il nome della proprietà da visualizzare
    optionsText: 'Nome',
    //stabilisco se è possibile selezionare il valore null (non selezionato)
    valueAllowUnset: true,
    //stabilisco dove scrivere la scelta della selezione
    value: $data.MezzoSelezionato,
    optionsCaption: 'Nessuno'">
        </select>
        <!--associo il bottone alla funzione che fa la chiamata ajax per caricare gli elementi dal server-->
        <input type="button" value="Carica" data-bind="click: Carica" />
        <!--associo il bottone alla funzione salva le modifiche al mezzo selezionato-->
        <input type="button" value="Salva" data-bind="enable:MezzoSelezionato()!=null, click: SalvaMezzo" />
        <div>
            <!--nel caso sia selezionato un mezzo associo il valore con la proprietà Nome del mezzo selezionato, diversamente mostro 'Nessuno'-->
            <input data-bind="value: $data.MezzoSelezionato() != null ? $data.MezzoSelezionato().Nome : 'Nessuno'"/>
            <!--nel caso sia selezionato un mezzo associo il valore con la proprietà Targa del mezzo selezionato, diversamente mostro 'Nessuno'-->
            <input data-bind="value: $data.MezzoSelezionato() != null ? $data.MezzoSelezionato().Targa : 'Nessuno'"/>
        </div>
    </div>
</body>
</html>


8) fai girare, otterrai un piccolo programmino completo che ti consentirà di caricare gli elementi tramite ajax, selezionarne uno (o nessuno), visualizzare e/o modificare Nome e Targa dell'elemento selezionato ed in fine salvare (o quantomeno inviare le modifiche al server, da li puoi salvare come ti pare).
Come vedi non ci sono controlli asp.net, la pagina espone solo dei metodi statici lato server, e questi vengono chiamati dal client.
In pratica con questo metodo puoi stare sullo stile asp manipolando direttamente tu gli elementi html, ma con la differenza che al posto di scrivere gli array lato client dalla pagina lato server, li metti in binding (li associ) con i controlli in html. Ovviamente dovrai imparare ad usare bene knockout, a quel punto potrai tranquillamente fare esattamente quello che vuoi, compreso manipolare css e jquery.

Comunque anche con MVC (quantomeno molto di più di asp.net) hai un ottimo controllo sul codice, ma ovviamente non è mai come fare tutto a mano.
Sono un programmatore Web Form. Direi che ti conviene orientarti verso MVC. In web form ci sono alcune limitazioni e molte più ottimizzazioni da fare se vuoi fare un lavoro completo.

Ormai programmano tutti... ma la professionalità appartiene a pochi
41 messaggi dal 09 gennaio 2012
grazie per la risposta :-)
Quindi MVC anche per i gestionali o e' piu' consigliato per siti web ?
41 messaggi dal 09 gennaio 2012
grazie per l'esempio. Ho dato una prima lettura e un po di cose non mi sono chiare (non conosco knockout ma mi sebmra interessante lo spunto)
59 messaggi dal 17 maggio 2010
Ciao,
figurati, e sempre un piacere avere a che fare con chi vuole davvero imparare nuove cose.

In realtà knockout non sarebbe nemmeno necessario, ma sicuramente ti aiuta tantissimo, sopratutto per via del fatto che tutto il codice rimane ordinato, hai gli strati REALMENTE separati (infatti si usa MVVM: Model-View-ViewModel), ma questo lo puoi ottenere anche con MVC, anche se secondo me, dopo averli utilizzati entrambe in progetti in produzione, MVC risulta più semplice da usare perché ha più pappe pronte, ma è più complesso il separare nettamente gli strati senza dover ritoccare qualcosina (rompendo così il pattern)... Diciamo che con MVC tiri più verso DOTNET (nel senso più elaborazione server e il client fa solo da vista), mentre con MVVM usi più il client (in realtà nel client trovi già i 3 strati: HTML5 come view, knockout per i ViewModel, e breeze come model) perché sei portato a fare applicazioni non dipendenti dal server in quanto una volta fatto bene il client poco importa da che tipo di server provengono i dati, poi è usabile anche offline, inviando l'aggiornamento magari quando c'è la linea, questo perché i dati (ovviamente recuperati con json) puoi farli risiedere nel client stesso (magari caricando all'avvio solo quelli che ti servono), ed usando le query direttamente sui dati in cache senza chiamare il server.
Inoltre knockout ti agevola la vita tenendo lo stato delle cose e notificando i cambi di valore, in questo modo non hai bisogno di postback o aggiornare i valori tu a mano o cose simili, infatti per questo poi si è portati a creare SPA, ti basta associarli e tutto va da se, e lavori solo sul codice e non sugli elementi grafici, in questo modo puoi cambiare in qualsiasi momento interfaccia senza dover ritoccare nulla della logica, e così pure per gli altri strati (sono tutti intercambiabili senza modificare nulla).

In ogni caso puoi sempre aggiornare manualmente i valori tramite jquery senza knockout (in pratica dovresti fare quello che fa knockout).

Il mio consiglio è quello di crearti le webApi e svincolare completamente il client dal tipo di server e dalla tecnologia che sta sotto. Infatti se usi json (webApi parlano json) poco importa se il server e IIS o apache quel che è, l'importante è che esponga json/odata.
Se poi usi breeze (credo però che le webApi Breeze per il server siano disponibili solo per NET, ma puoi sempre usare la parte client di breeze e caricare i dati senza che sia presente anche nel server) allora ti trovi anche il modello bello pronto, e puoi interrogare il server con query create direttamente nel client (sia in cache, sia miste, sia al server) sfruttando ODATA (per il server) o breeze nella cache.
Insomma visto che provieni come me da asp classico dove si faceva tutto a mano e non esistevano controlli in rendering o menate varie, bene allora questo fa per te! Qui si usa il client in HTML5 puro e javascript (o jquery), e non sei legato a nessuna tecnologia in particolare... prova ad immaginare quanta indipendenza puoi avere, non saresti legato nemmeno a NET, figurati quanto puoi controllare css e jquery!

Comunque se vuoi esponi cosa non ti è chiaro, sicuramente basterà qualche spiegazione, ma avendo già quello stile lavorativo (stile asp classic) si tratterà solo di inquadrare la sintassi.
Modificato da u235 il 09 ottobre 2014 22.09 -
Modificato da u235 il 09 ottobre 2014 22.16 -
41 messaggi dal 09 gennaio 2012
Grazie u235 !
Mi sembra di capire la struttura che suggerisci per l'applicazione ma ho qualche domanda: Se vuoi indicare un url specifico, poniamo per l'elenco clienti, come si fa se questo in realta' lo ottieni non ricaricando la pagina e agendo via ajax ?

Non e' che hai un esempio di operazioni CRUD con un piccolo db di esempio in modo da potermelo studiare e rendermi conto ?

Mi piacerebbe testare questo modo di lavoro, in una prima fase in modo "liscio" senza troppi framework che mi semplificano e mi nascondono la logica e poi , man mano che mi sono chiare le cose , aggiungere knockout e altro per velocizzare lo sviluppo.

Pensi che possa essere un buon modo di procedere ?

grazie per la tua disponibilita'
:-)

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.