78 messaggi dal 18 aprile 2018
 [Table("Animali")]
    public class Animale
    {
        [Key]
        public int IdAnimale { get; set; }
        public string foto { get; set; }
        public int? idTipoAnimale { get; set; }
        [ForeignKey("idTipoAnimale")]
        public TipoAnimale tipiAnimale { get; set; }
        public string nomeAnimale { get; set; }
        public int? idTaglia { get; set; }
        [ForeignKey("idTaglia")]
        public TagliaAnimale tagliaAnimali { get; set; }
        public int? idRazza { get; set; }
        [ForeignKey("idRazza")]
        public Razza razze { get; set; }
        public string UserId { get; set; }
        public virtual ApplicationUser ApplicationUser { get; set; }
        public int? idPelo { get; set; }
        [ForeignKey("idPelo")]

        public TipoPelo tipiPelo { get; set; }
    }
[Table("Note")]
    public class Nota
    {
        [Key]
        public int IdNota { get; set; }
        public string Testo { get; set; }
        public DateTime DataIns { get; set; }
        public string UserId { get; set; }

        public virtual ApplicationUser ApplicationUser { get; set; }
    }
[Table("Appuntamenti")]
    public class Appuntamento
    {
        [Key]
        public int idAppuntamento { get; set; }
        public string UserId { get; set; }
        public virtual ApplicationUser ApplicationUser { get; set; }

        public string Descrizione { get; set; }
        public int idServizio { get; set; }
        [ForeignKey("idServizio")]
        public Servizio servizi { get; set; }
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime Start_Data { get; set; }
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime End_Data { get; set; }
        public string ThemeColor { get; set; }
        public bool IsFullDay { get; set; }


    }

public class ApplicationUser : IdentityUser
    {

        public virtual Animale Animali { get; set; }
        public virtual Appuntamento Appuntamenti { get; set; }
        public virtual Nota Note { get; set; }


// e questo nel onModelCreating

 modelBuilder
              .Entity<Appuntamento>()
              .HasRequired(m => m.ApplicationUser)
              .WithMany()
              .HasForeignKey(a => a.UserId);

            modelBuilder
              .Entity<Nota>()
              .HasRequired(m => m.ApplicationUser)
              .WithMany()
              .HasForeignKey(a => a.UserId);

            modelBuilder
              .Entity<Animale>()
              .HasRequired(m => m.ApplicationUser)
              .WithMany()
              .HasForeignKey(a => a.UserId);

sono tre tabelle che dovranno fare la stessa cosa di note
11.729 messaggi dal 09 febbraio 2002
Contributi

modelBuilder
.Entity<Nota>()
.HasRequired(m => m.ApplicationUser)
.WithMany()
.HasForeignKey(a => a.UserId);

Bene, hai indicato che ogni ApplicationUser possiede molte note, però devi anche indicare che la prioprità di navigazione che permette di accedervi è Note. Modifica così:
 modelBuilder
              .Entity<Nota>()
              .HasRequired(m => m.ApplicationUser)
              .WithMany(user => user.Note)
              .HasForeignKey(a => a.UserId);



Ovviamente la proprietà di navigazione Note deve essere di tipo ICollection<Nota>, in modo che possa accogliere le molte note dell'utente.

public class ApplicationUser : IdentityUser
{
  //...
  public virtual ICollection<Nota> Note { get; set; }
}


A questo punto riuscirai a fare il foreach dalla view che ti indicavo nel post precedente.

ciao,
Moreno
Modificato da BrightSoul il 20 giugno 2018 00.35 -

Enjoy learning and just keep making
78 messaggi dal 18 aprile 2018
Impeccabile come sempre.
Grazie
78 messaggi dal 18 aprile 2018
Ciao Moreno,
un altra cosa come ho detto prima application user saranno i clienti quindi ho creato il controller applicationUser che in automatico mi ha generato le View Create,Edit, Index ecc.., ho visto che creando un nuovo "Cliente" manualmente l'id essendo una stringa va inserito a mano e giustamente mi chiede di inserire anche una password...

per quanto riguarda l'id avevo pensato di generare un una stringa random composta da lettere e numeri e fare un ciclo for dove controllo tutti gli user e se non è presente uso quello ma se ci fosse un modo di utilizzare quello che usa lui quando un utente si registra sarebbe meglio.. accetto consigli.

Mentre per quanto riguarda la password avevo pensato di usare io una password di default non visibile all'admin quando crea il cliente e convertirla utilizzando questo codice

using System.Security.Cryptography; 


//ho inserito questo metodo
public string GenerateMD5(string yourString)  
{
       return string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(yourString)).Select(s => s.ToString("x2")));
}

// e nel controller

                [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Nome,Cognome,Telefono,Cellulare,DataDiNascita,Sesso,Indirizzo,Cap,Provincia,Email,PasswordHash,AccessFailedCount,UserName")] ApplicationUser applicationUser)
        {
            string pass = "dcgvtrhgtr";
            

            if (ModelState.IsValid)
            {
                applicationUser.UserName = applicationUser.Email;
                applicationUser.AccessFailedCount = 0;
                applicationUser.PasswordHash = GenerateMD5(pass);
                db.Users.Add(applicationUser);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(applicationUser);
        }


altra cosa..
ho voluto inserire il create degli utenti in un modal nella stessa pagina, ovvero nell'index, per farlo ho utilizzato

@{ Html.RenderAction("Create", "Clienti"); }


ma mi restituisce un errore:


Il valore non può essere null.
Nome parametro: value
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere la traccia dello stack. 

Dettagli eccezione: System.ArgumentNullException: Il valore non può essere null.
Nome parametro: value

Errore nel codice sorgente: 


Riga 35:         {
Riga 36:             
Riga 37:             return View(db.Users.ToList().Where(x=>x.Nome.Contains(s)));
Riga 38:         }
Riga 39: 



sembra non darmi più errore togliendo quel controller, ovvero questo:

 
        //[HttpPost]
        //public ActionResult Index(String s)
        //{
            
        //    return View(db.Users.ToList().Where(x=>x.Nome.Contains(s)));
        //}


l'ho commentato e ora non mi da più errore... boh
che mi consigli?
Modificato da Mirko2018 il 23 giugno 2018 00.51 -
Modificato da Mirko2018 il 23 giugno 2018 01.21 -
11.729 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,


db.Users.Add(applicationUser);

no, così non va bene. Devi usare la classe UserManager<ApplicationUser> per creare gli utenti. Microsoft l'ha messa a disposizione proprio per evitarti di usare algoritmi di hashing della password molto fiacchi come questo.

applicationUser.PasswordHash = GenerateMD5(pass);

Usando una rainbow table si può risalire molto facilmente alla password originale da un hash MD5 (se non conteneva un salt abbastanza lungo).

Quindi, usa lo UserManager.CreateAsync come vedi qui, che userà un algoritmo di derivazione della password più robusto, che prevede migliaia di iterazioni.
http://www.aspitalia.com/articoli/asp.net4.5.1/introduzione-asp.net-identity-p-2.aspx
Il metodo CreateAsync vuole due argomenti: l'istanza di ApplicationUser e la password in chiaro. Poi penserà lui a creare l'hash.


Invece, a proposito dell'altro problema:
//[HttpPost]
        //public ActionResult Index(String s)
        //{
            
        //    return View(db.Users.ToList().Where(x=>x.Nome.Contains(s)));
        //}

Boh, presumo che il campo privato "db" non sia stato valorizzato? Dove gli stai assegnando l'istanza del DbContext?
Modificato da BrightSoul il 23 giugno 2018 10.53 -

Enjoy learning and just keep making
78 messaggi dal 18 aprile 2018
Buongiorno Moreno,
ho letto il link che mi hai segnalato, forse non ho capito bene come utilizzarlo nella mia applicazione,
ho il controller applicationUser, la parte che mi interessa è appunto nella creazione del nuovo Utente per la password (che non dovrà inserire chi l'admin che crea un nuovo cliente) e per l'id.. quindi da link che mi hai segnalato ho preso questo

var user = new ApplicationUser() { UserName = model.UserName };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
    await SignInAsync(user, isPersistent: false);
    return RedirectToAction("Index", "Home");
}


inserendolo nel mio controller create cosi

[HttpPost]
        [ValidateAntiForgeryToken]
        public async System.Threading.Tasks.Task<ActionResult> CreateAsync([Bind(Include = "Id,Nome,Cognome,Telefono,Cellulare,DataDiNascita,Sesso,Indirizzo,Cap,Provincia,Email,EmailConfirmed,PasswordHash,SecurityStamp,PhoneNumber,PhoneNumberConfirmed,TwoFactorEnabled,LockoutEndDateUtc,LockoutEnabled,AccessFailedCount,UserName")] ApplicationUser applicationUser)
        {
            string pass = "PasswordTemporanea!5655£d";


           

            if (ModelState.IsValid)
            {
                var user = new ApplicationUser() { UserName =applicationUser.UserName };
                var result = await UserManager.CreateAsync(user, pass);
           
                applicationUser.UserName = applicationUser.Email;
                applicationUser.AccessFailedCount = 0;
                applicationUser.PasswordHash = GenerateMD5(pass);
                db.Users.Add(applicationUser);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(applicationUser);
        }

mi segnala rosso su UserManager... chiaramente è sintatticamente sbagliato ma non so come implementarlo,
grazie per la pazienza
Modificato da Mirko2018 il 23 giugno 2018 13.41 -
11.729 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,
un esempio di utilizzo dello usermanager lo trovi già nella tua applicazione, all'interno dell'AccountController. Ti basta copiare il codice da lì.

Ecco un esempio: metti questa proprietà nel tuo controller.
private ApplicationUserManager _userManager;
        public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
            }
            private set
            {
                _userManager = value;
            }
        }


A questo punto non ti segnalerà più rosso quando proverai ad usare UserManager.
Se non funziona, vedi come è stato fatto nel tuo AccountController e copia da lì.

ciao,
Moreno
Modificato da BrightSoul il 23 giugno 2018 22.30 -

Enjoy learning and just keep making
78 messaggi dal 18 aprile 2018
ok con un po di fatica ci sono riuscito, oltre alla tua proprietà ho dovuto cambiare anche la view ovvero ho dovuto modificare cosi:

@using (Html.BeginForm("CreateAsync", "Clienti", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))


e alla fine è andato.

Grazie mille
alla prossima consulenza. :D
Modificato da Mirko2018 il 24 giugno 2018 01.54 -

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.