Asp.Net Mvc 5 Uppdatera användardata

Permalänk
Medlem

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?

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

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.

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB

Permalänk
Medlem
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:(

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

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

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem
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å?

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

@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);

Permalänk
Medlem
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

Visa signatur

Citera om du vill ha svar :)