272 messaggi dal 17 settembre 2006
Ma quante ne sai  , aggiornando alla 2.2.1 funziona correttamente Grazie
6 messaggi dal 10 luglio 2015
Scusate l'ignoranza... ma ho appena iniziato a studiare come funziona l'mvc con asp e sono un attimo perso...
Potreste suggerirmi un modo per vedere onlineUsers e onlineUsersCount in una vista?
La mia idea era quella di creare un Model (o un ViewModel? non ho ancora ben capito...) che contenesse le due variabili per poi andarle a richiamare, attraverso un controller, da una View... ma sono completamente bloccato in questa fase... :-/
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao e benvenuto nel forum!
La cosa più semplice da fare è passare solo onlineUsers alla view. Infatti, passare anche il conteggio non è necessario perché puoi calcolarlo in qualsiasi momento dalla view stessa usando la proprietà Count della lista di utenti che gli è stata passata dal controller. Quindi, nell'action del controller scrivi semplicemente:
return View(onlineUsers);

e poi, in cima alla view, indichi il tipo di Model (una lista di ApplicationUser, appunto).
@model IList<ApplicationUser>

Ora che la view è stata fortemente tipizzata, puoi accedere agli utenti dalla proprietà Model e ciclarli con un foreach.
@foreach(var utente in Model)
{
<p>@utente.Username</p>
}

Se vuoi stampare il conteggio, invece, ti basta scrivere:
<p>Numero di utenti connessi: @Model.Count</p>


wizzy ha scritto:

Model (o un ViewModel? non ho ancora ben capito...)

E' solo una questione di nomenclatura. Per semplificare: un "Model" è un oggetto che rappresenta una singola entità come un Utente, una Fattura, un Prodotto o una lista di essi. Invece, un "ViewModel" è un oggetto creato allo scopo di passare alla view più "Model", come nel caso di una homepage, che deve visualizzare un po' di questo e un po' di quello, essendo la vetrina del sito.
In entrambi i casi si tratta di normalissime classi. Dalla view usi sempre e comunque la direttiva @model e la proprietà Model.

ciao,
Moreno

Enjoy learning and just keep making
6 messaggi dal 10 luglio 2015
Prima di tutto grazie per la risposta... ho cercato di studiare meglio le alternative con cui passare dati dal controller alla view ma nessuno faceva quello che volevo...
Ho risolto però creando un helper (credo si chiami così...) in una custom pageBaseType così facendo riesco ad accedere alla lista degli utenti online (come anche all'utente attualmente loggato) da qualsiasi view.
Credi sia un buon modo o ha qualche svantaggio che non riesco a vedere?
Modificato da wizzy il 17 luglio 2015 20.12 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
se vuoi che l'elenco appaia in tutte le pagine, puoi usare l'helper dalla view _Layout.cshtml, in cui solitamente metti gli elementi fissi del sito (es. il menu, header e footer).

In alternativa, se vuoi mostrare l'elenco solo in determinate view, puoi incapsulare la funzionalità di estrazione e visualizzazione degli utenti in una child action (e relativa view).

Usare un pageBaseType custom in questo caso non è necessario, perché non hai propriamente bisogno di modificare le proprietà e i metodi che ti vengono resi disponibili nella view.

ciao,
Moreno

Enjoy learning and just keep making
6 messaggi dal 10 luglio 2015
Grazie, ho impostato tutto come mi hai spiegato e non ho avuto problemi...
Ne avrei un altro per quanto riguarda il filtro vero e proprio che ho modificato come OnResultExecuted in questo modo:

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    IIdentity userIdentity = filterContext.RequestContext.HttpContext.User.Identity;

    if (!userIdentity.IsAuthenticated)
    {
        return;
    }

    ApplicationUserManager userManager = filterContext.RequestContext.HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    ApplicationUser user = userManager.FindByNameAsync(userIdentity.Name).Result;

    if (user.IsValid())
    {
        user.TrackActivity();
        userManager.UpdateAsync(user).Wait();
                
        user.SetContextInfo();
    }
}


come vedi ho aggiunto la funzione SetContextInfo() che nella classe user è definita così:

public void SetContextInfo()
{
    ApplicationDbContext dbContext = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();
    int contextId = 0x10000000; // varbinary(128)

    dbContext.Database.ExecuteSqlCommand("SET CONTEXT_INFO " + contextId);
}


purtroppo non capisco perchè non funziona, se però provo ad escludere la tua TrackActivity e l'UpdateAsync invece funziona tutto correttamente...
Ho provato anche ad eseguire il comando con ExecuteSqlCommandAsync("SET CONTEXT_INFO " + contextId).Wait() ma in questo caso traccia l'ultima azione dell'utente ma non imposta il CONTEXT_INFO.

Puoi darmi una mano? non capisco molto bene come funzionano questo comandi Async... :-/
Modificato da wizzy il 06 agosto 2015 20.36 -
Modificato da wizzy il 06 agosto 2015 20.39 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
wizzy ha scritto:

purtroppo non capisco perchè non funziona

Spiega dettagliatamente cosa succede. Per esempio: i dati non vengono salvati? La pagina non completa mai il caricamento?

Inoltre, spiega perché stai usando SET CONTEXT_INFO. Eventualmente posta il link all'articolo in cui veniva spiegato, per dare un po' di contesto alla situazione in cui ti trovi.

ciao,
Moreno

Enjoy learning and just keep making
6 messaggi dal 10 luglio 2015
Ciao Moreno, facevo riferimento al tuo tutorial a cui io poi ho aggiunto il SET CONTEXT_INFO per esigenze mie con la sessione attuale col db.
In sostanza se eseguo i comandi in questo ordine sembra funzionare:

user.LastActivityDate = DateTime.UtcNow;
userManager.UpdateAsync(user).Wait();

ApplicationDbContext dbContext = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();
int contextId = 0x10000000; // varbinary(128)
dbContext.Database.ExecuteSqlCommand("SET CONTEXT_INFO " + contextId);


se invece li scambio in questo modo:

ApplicationDbContext dbContext = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();
int contextId = 0x10000000; // varbinary(128)
dbContext.Database.ExecuteSqlCommand("SET CONTEXT_INFO " + contextId);

user.LastActivityDate = DateTime.UtcNow;
userManager.UpdateAsync(user).Wait();


sembra che venga registrata solo l'ultima attività e non viene settato il CONTEXT_INFO... mi sembra abbastanza strano che un semplice cambio di ordine di esecuizione possa dare questi problemi quindi volevo capire quale potesse essere il problema.
Modificato da wizzy il 07 agosto 2015 21.16 -

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.