De afgelopen dagen zit ik me aardig te breken over een probleem wat ik heb in MVC.
Ik heb natuurlijk een layout.cshtml waarachter nog een partial view wordt geladen in de header om een gebruiker in te loggen of het gebruikersmenu te laten zien.
Initieel had ik de problemen dat toen ik @Html.Partial("_LoginPartial") gebruikte, ik een error kreeg dat het verkeerde model wordt gebruikt als ik op een pagina kwam waar ook een model gebruikt werd.
Dit heb ik toen veranderd naar @{Html.RenderAction("Login", "User");}
Met als controller code
Dit werkte netjes, ik kon inloggen en naar verschillende pagina's browsen.
Nu loop ik echter er tegen aan dat als ik een form submit, mijn login opnieuw afgaat.
Dus ben weer aan het zoeken, maar ik kan hier geen oplossing voor vinden.
Om in te loggen gebruik ik het volgende:
View
Controller:
Manage (waar het mis gaat)
En de controller ervan
Hoe kan ik hier in godsnaam omheen komen anders dan de login in een aparte view te plaatsen die via een knop login te benaderen is?
Ik heb natuurlijk een layout.cshtml waarachter nog een partial view wordt geladen in de header om een gebruiker in te loggen of het gebruikersmenu te laten zien.
Initieel had ik de problemen dat toen ik @Html.Partial("_LoginPartial") gebruikte, ik een error kreeg dat het verkeerde model wordt gebruikt als ik op een pagina kwam waar ook een model gebruikt werd.
Dit heb ik toen veranderd naar @{Html.RenderAction("Login", "User");}
Met als controller code
code:
1
2
3
4
5
| [ChildActionOnly]
public PartialViewResult Login()
{
return PartialView("_LoginPartial");
} |
Dit werkte netjes, ik kon inloggen en naar verschillende pagina's browsen.
Nu loop ik echter er tegen aan dat als ik een form submit, mijn login opnieuw afgaat.
Dus ben weer aan het zoeken, maar ik kan hier geen oplossing voor vinden.
Om in te loggen gebruik ik het volgende:
View
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| @if (User.Identity.IsAuthenticated)
{
<div>No login</div>
}
else
{
using (Html.BeginForm("Login", "User", FormMethod.Post))
{
@Html.AntiForgeryToken();
@Html.ValidationSummary(true, "Login failed.")
<div class="Login">
//fields here
</div>
}
} |
Controller:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(User user)
{
if (ModelState.IsValid)
{
if (isValid(user.Email, user.Password))
{
using (MVCV2DbContext MVCV2DbContext = new MVCV2DbContext())
{
var users = MVCV2DbContext.Users.Single(u => u.Email == user.Email);
FormsAuthentication.SetAuthCookie(users.ID.ToString(), false);
}
return RedirectToAction("Index", "User");
}
}
return View(user);
} |
Manage (waar het mis gaat)
code:
1
2
3
4
5
6
7
8
| using (Html.BeginForm("Manage", "User", FormMethod.Post))
{
@Html.AntiForgeryToken();
@Html.ValidationSummary(true, "Not all good")
<div>
//fields here
</div>
} |
En de controller ervan
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Manage(User_Details users)
{
if (ModelState.IsValid)
{
int U_ID = Convert.ToInt32(GetUserIDFromCookie());
using (MVCV2DbContext MVCV2DbContext = new MVCV2DbContext())
{
var user = MVCV2DbContext.User_Details.SingleOrDefault(u => u.User_ID == U_ID);
if (user != null)
{
user.User_FirstName = users.User_FirstName;
user.User_Insertions = users.User_Insertions;
user.User_LastName = users.User_LastName;
MVCV2DbContext.SaveChanges();
}
}
}
return View();
} |
Hoe kan ik hier in godsnaam omheen komen anders dan de login in een aparte view te plaatsen die via een knop login te benaderen is?