Asp.Net Mvc 5 Uppdatera användardata

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004

Asp.Net Mvc 5 Uppdatera användardata

Jag har lagt till BirthDate, FullName och Country då man registrerar sig på sidan, det funkar och lagras i databasen som det ska, nu vill jag ge användarna möjlighet att ändra viss data men får det inte riktigt att fungera, nån som kan peka mig i rätt riktning?

CS1501 no overload for method 'GetUserId' takes 1 argument får jag med denna koden i ManageController när jag gör en build
ManageController:

public ActionResult SetCountry() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> SetCountry(SetCountryViewModel model) { if (!ModelState.IsValid) { return RedirectToAction("SetCountry", "Manage"); } var user = await User.Identity.GetUserId(model.Country); if (user != null) { var result = await UserManager.UpdateAsync(user); if (result.Succeeded) { result = await UserManager.UpdateAsync(user); } } return RedirectToAction("Index", "Manage"); }

SetCountry.cshtml

@model SampleProject.Models.SetCountryViewModel @{ ViewBag.Title = "Change Country"; } <h2>@ViewBag.Title.</h2> <p class="text-info"> Here you can change your Country. </p> @using (Html.BeginForm("SetCountry", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() @Html.ValidationSummary("", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(m => m.Country, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.Country, new { @class = "form-control" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="OK" class="btn btn-default" /> </div> </div> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

SetCountryViewModel inuti ManageViewModels:

public class SetCountryViewModel { [Required] [Display(Name = "Country")] public string Country { get; set; } }

har också prova ManageController:

public ActionResult SetCountry() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> SetCountry(SetCountryViewModel model) { if (ModelState.IsValid) { var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", new {Message = "Success"}); } return View(model); }

är jag ens på rätt spår?

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Registrerad
Jun 2008

var user = await User.Identity.GetUserId(model.Country); Är det denna raden som blir fel?

Vad säger felmeddelandet?
CS1501 no overload for method 'GetUserId' takes 1 argument får jag med denna koden i ManageController när jag gör en build

Något är fel med ditt anrop till GetUserId den har inte 1 argument. Om du kollar på metoden så ser du vad det är för input den metoden ska ha.

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
Skrivet av Verdurakh:

var user = await User.Identity.GetUserId(model.Country); Är det denna raden som blir fel?

Vad säger felmeddelandet?
CS1501 no overload for method 'GetUserId' takes 1 argument får jag med denna koden i ManageController när jag gör en build

Något är fel med ditt anrop till GetUserId den har inte 1 argument. Om du kollar på metoden så ser du vad det är för input den metoden ska ha.

Jo jag vet, men jag får fan inte till detta, det vill sig inte haha:(

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004

Då jag sätter detta i ManageController:

[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> SetCountry(SetCountryViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser() { UserName = model.Country }; var result = await UserManager.CreateAsync(user, model.Country); if (result.Succeeded) { await SignInManager.SignInAsync(user, false, false); return RedirectToAction("Index", "Home"); } else { AddErrors(result); } } return View(); }

Om jag tex sätter in irland som nytt country får jag validation error: " Passwords must have at least one digit ('0'-'9')."
sätter jag t.ex irland321312 får jag error: "Email cannot be null or empty."
whats up with that?!

Om jag skulle lägga till en textbox för email password osv i min SetCountry.cshtml skulle det fungera då? förstår inte riktigt detta

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2004

Använd UserManager.FindByIdAsync(User.Identity.GetUserId()) för att hämta användaren. Ändra sedan på objektet du (förhoppningsvis) fick tillbaka. Använd sedan UserManager.UpdateAsync(user) för att spara ändringarna på objektet.

as far as we can tell, the massacre went well...

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
Skrivet av jovnas:

Använd UserManager.FindByIdAsync(User.Identity.GetUserId()) för att hämta användaren. Ändra sedan på objektet du (förhoppningsvis) fick tillbaka. Använd sedan UserManager.UpdateAsync(user) för att spara ändringarna på objektet.

i senaste inlägget ja gjorde, så om jag ändrar

var result = await UserManager.CreateAsync(user, model.Country);

till att istället använda

var result = await UserManager.UpdateAsync(user, model.Country);

så får jag error "no overload method for 'UpdateAsync' takes 2 arguments." vad måste jag ändra på då?

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jul 2006

@pellski87:

Du ska inte skicka med det du vill uppdatera till UpdateAsyc metoden. Ta och ändra det du vill ändra på User entiteten och skicka sedan endast med den till UpdateAsync.
ex (pseudo kod):

var u = UserManager.FindByIdAsync(User.Identity.GetUserId()); u.Country = "nytt country"; UpdateAsync(u);

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
Skrivet av DegJ:

@pellski87:

Du ska inte skicka med det du vill uppdatera till UpdateAsyc metoden. Ta och ändra det du vill ändra på User entiteten och skicka sedan endast med den till UpdateAsync.
ex (pseudo kod):

var u = UserManager.FindByIdAsync(User.Identity.GetUserId()); u.Country = "nytt country"; UpdateAsync(u);

Okej, jag förstår Typ hur du menar men jag får inte ihop det i praktiken.. är rätt ny både på c# och asp, försöker lära mig detta haha

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)