ASP.NET Zone

Die ASP.NET Community. Alle Antworten rund um Microsoft® Webtechnologien
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe | Impressum | ASP.NET Zone Suchplugin

in
Home Blogs Foren FAQ Communities Fotos Downloads

Anfängerfrage zum AccountController

Letzter Beitrag 10-12-2017, 15:40 von Telefisch. 1 Antworten.
Beiträge sortieren: Zurück Weiter
  •  10-11-2017, 19:21 226057

    Anfängerfrage zum AccountController

    Hallo Forum,
    ich bin frisch mit ASP.Net MVC angefangen und habe auch gleich eine Stelle wo ich nicht weiter komme.

    Normalerweise löse ich mit einem submit ein ActionResult in einem Controller aus dem ich ein zugehöriges Model dabei übergebe.
    Vor dem Speichern eines Datensatzes kann ich dann auf die Daten des Models und damit auf die Gültigkeitsprüfung Einfluss nehmen.

    Als Beispiel habe ich eine Form zum Anlegen von Mitarbeitern. Solch ein Datensatz soll ein Feld (decimal) Teilzeitstunden und einen Feld (bool) Vollzeit haben.
    Teilzeitstunden ist Required. wird nun Vollzeit wahr und ich speichere die Daten prüfe ich mittels 

    if(employee.Vollzeit)
        employee.Teilzeitstunden=8;

    Damit ist meine Validitätsprüfung einwandfrei gelaufen.

    Jetzt möchte ich das Ganze für die User im AccountController genauso abbilden.
    Der Code ist im Grunde das Original aus dem Template, nur dass ich vor ModelState.IsValid eben versuche die Teilzeitstunden  auf 8 zu setzen.
    Ich bekomme hier immer die Fehlermeldung im Form, dass das Feld erforderlich ist.
    Genau das gleiche Problem habe ich mit zwei Hidden-Feldern, die ich vor dem Speichern ausfüllen wollte (model.LastChange und model.LastChangeBy.

    Was ist denn hier anders als in einem "normalen" Controller? Ich kapiere das noch nicht wirklich.

    Ich hoffe ich konnte mich einigermaßen verständlich machen...


    Der AccountController:

    // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        model.LastChange = DateTime.Now;
        model.LastChangeBy = 1;
        if (model.FullTime)
        {
            model.PartTimeHours = 8;
        }
     
        if (ModelState.IsValid)
        {
     
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                
                // Weitere Informationen zum Aktivieren der Kontobestätigung und Kennwortzurücksetzung finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=320771".
                // E-Mail-Nachricht mit diesem Link senden
                // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                // await UserManager.SendEmailAsync(user.Id, "Konto bestätigen", "Bitte bestätigen Sie Ihr Konto. Klicken Sie dazu <a href=\"" + callbackUrl + "\">hier</a>");
     
                return RedirectToAction("Index""Home");
            }
            AddErrors(result);
        }
     
        // Wurde dieser Punkt erreicht, ist ein Fehler aufgetreten; Formular erneut anzeigen.
        return View(model); 
    }

    Der funktionierende selbst gebastelte Controller:


    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Save(Employee employee)
    {
        if (!ModelState.IsValid)
        {
            var viewModel = new EmployeeFormViewModel
            {
                Employee = employee,
                Countries = _context.Countries.ToList(),
                FamilyStatus = _context.FamilyStatus.ToList()
            };
            return View("EmployeeForm", viewModel);
        }
        if (employee.Id == 0)  //neuer Mitarbeiter
        {
            employee.LastChange = DateTime.Now;
            employee.LastChangeBy = 1;          
            if (employee.FullTime)
            {
                employee.PartTimeHours = 8;
            }
            _context.Employees.Add(employee);
        }
        else
        {
            var employeeInDb = _context.Employees.Single(e => e.Id == employee.Id);
            employeeInDb.Active = employee.Active;
            employeeInDb.BusinessMobile = employee.BusinessMobile;
            employeeInDb.City = employee.City;
            employeeInDb.CountryId = employee.CountryId;
            employeeInDb.Email = employee.Email;
            employeeInDb.Familyname = employee.Familyname;
            employeeInDb.Firstname = employee.Firstname;
            employeeInDb.FullTime = employee.FullTime;
            employeeInDb.LastChange = DateTime.Now;
            employeeInDb.LastChangeBy = 1;      
            if (employee.FullTime)
            {
                employeeInDb.PartTimeHours = 8;
            }
            else
            {
                employeeInDb.PartTimeHours = employee.PartTimeHours;
            }
        }
        _context.SaveChanges();
        return RedirectToAction("Index""Employees"); 
    }

    Der Totale Anfänger...
  •  10-12-2017, 15:40 226058 Antwort zu 226057

    AW: Anfängerfrage zum AccountController

    Ich hab den Fehler gefunden...
    Problem war nicht die Verifikation, das hat das erste Form genau so gehandelt.
    Was ich übersehen hatte, dass ich dem ersten Form beim Aufruf bereits ein new model übergeben hatte, womit natürlich die Zahlenfelder bereits mit 0 statt null initialisiert waren.

    ...ist echt noch ziemlich verwirrend mit den ganzen Zusammenhängen...

    Der Totale Anfänger...
Als RSS Feed in XML ansehen
Powered by Community Server (Commercial Edition)