小弟目前還在自學MVC的 Coding,已經做好登入登出跟註冊系統,可是現在差在要『修改會員資料』與『修改密碼』。
我的想法是把登入的資訊(包括數量Num跟帳號ID值)抓出來,我驗證登入的方式是抓取Session,可是我從ChangePassword中,抓出的Session值是亂碼,無法抓到正確的登入帳號相關資訊,請問各位有甚麼方法可以從controller中抓取帳號的資訊嗎?
我的改密 Model:
public class ChangePassword
{
[Required]
[DataType(DataType.Password)]
[Display(Name ="舊密碼")]
public string OldPassword { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "新密碼")]
public string NewPassword { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "再次確認新密碼")]
[Compare("NewPassword", ErrorMessage = "新密碼與確認密碼不相符。")]
public string ConfirmPassword { get; set; }
public int ID { get; set; }
public string ChangePasswordErrorMsg {get;set;}
***我的改密 View:
@model MenberSystem.Models.ChangePassword
@{
ViewBag.title = "變更密碼";
if (Session["menberID"] == null)
{
Layout = "_Layout.cshtml";
Response.Redirect("~/Account/Login");
}
}
<h2>@ViewBag.title</h2>
@using (Html.BeginForm("ChangePassword", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>變更密碼表單</h4>
<hr />
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.OldPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.OldPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.NewPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.NewPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="變更密碼" class="btn btn-info" />
<input type="reset" value="重新輸入" class="btn btn-warning" />
<input type="button" value="上一頁" class="btn btn-dark" onclick="history.back()">
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
我的登入 controller
var menberDetail = db.Menber.Where(x => x.ID == menber.ID && x.Password == menber.Password).FirstOrDefault();
if (menberDetail == null)
{
menber.LoginMessLoginErrorMsg = "輸入錯誤 ";
TempData["message"] = "輸入錯誤,請重新輸入";
return View("Login", menber);
}
else
{
Session["menberID"] = menber.ID;
TempData["message"] = "登入成功";
return RedirectToAction("Index", "Home");
給您參考
ASP.NET MVC 5 - Identity. How to get current ApplicationUser
using Microsoft.AspNet.Identity;
var currentUserId = User.Identity.GetUserId();
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
或是
var currentUserId = System.Web.HttpContext.Current.User.Identity.GetUserId();
Homura大大的建議,若您沒有使用Identity,目前是用SESSION就先用SESSION吧
舜:你好
謝謝,我測試看看。
舜~:你好
我利用你上面說的方法,改成
var currentUserId = User.Identity.GetUserId();
Menber currentUser = db.Menber.FirstOrDefault(x => x.ID == currentUserId);
可是抓到的currntUserId = null值;
然後 Menber currentUser = null值。
我改利用這個方法測試,
var currentUserId = System.Web.HttpContext.Current.User.Identity.GetUserId();
抓到的 currentUserId = null值。
請問我是哪裡有下錯code以致抓到空值嗎?
我原本的想法是增加:
因為我在Login的條件登入後,我回傳 Session["menberID"]=menber.ID;可以到其他頁面做Session的驗證,也在改密碼的controller中抓到Session的值=帳號的值。
var CurrentUserID = Session["menberID"];
只是我不明白該如何把我抓到的Session["menberID"]的值轉換成去抓取資料庫=帳號來表示是使用者的資訊呢?
Homura:你好
下方是我修改密碼的controller
if (Session["menberID"] != null)
{
MenberSystemEntities2 db = new MenberSystemEntities2();
var CurrentUserID = Session["menberID"];
try
{
if (db.Menber.Where(p => p.Password == changePassword.OldPassword).FirstOrDefault() != null)
{
if (changePassword.NewPassword != changePassword.ConfirmPassword)
{
TempData["message"] = "新密碼與確認密碼錯誤,請重新輸入";
return View();
}
else
{
// user.passwor = changePassword.NewPassword;
db.SaveChanges();
return RedirectToAction("Login");
}
}
else
{
changePassword.ChangePasswordErrorMsg = "密碼輸入錯誤,請重新輸入";
TempData["message"] = "輸入錯誤";
return View();
}
}
catch (Exception ex)
{
ModelState.AddModelError("OldPassword", ex.Message);
return View(changePassword);
}
}
return View();
我原本的想法是增加:
因為我在Login的條件登入後,我回傳 Session["menberID"]=menber.ID;可以到其他頁面做Session的驗證,也在改密碼的controller中抓到Session的值=帳號的值。
var CurrentUserID = Session["menberID"];
只是我不明白該如何把我抓到的Session["menberID"]的值轉換成去抓取資料庫=帳號來表示是使用者的資訊呢?這個方法是可行的嗎?
terpoo1250
你的Session值是亂碼長怎樣
可以截張圖嗎?
Homura:你好
我一開始在登入那邊的時候看Session["menberID"]的值是
這時候我才發現,亂馬是屬於Session的ID值,因為我一開始抓出來的值確實是Session的ID值亂碼,我就誤以為是那個亂碼。
但是我從ChangePassword controller那邊抓回來的值是對的;
我抓到值後,想要跟資料庫的帳號做判斷條件,IF我的Session["menberID"]的值=DB的帳號ID值,就把符合ID的值所有資料(Include : Password Email Phone...)都抓出來,然後可以指定修改其Password、Email、Phone...相關的值。
只是我現在有想法可是不知道該如何下手...。
terpoo1250
可是你第一張圖照的是SessionID不是Session["menberID"]耶....
你這個方法是沒問題的
一開始我以為Identity可以幫我抓到User的ID值,可以上網查資料放入自己的Code中,卻發現抓到的User.Identity.GetUserId()值都是null值,我想問是我抓錯方法還是我下錯Code?
Homura:你好
沒錯,不過我再去看Session["menberID"]的值確實是我要的正確值沒錯,我看錯Session的ID碼。
terpoo1250
你要使用Identity認證才會有資料@@
可以查查ASP.NET Identity的教學
這是MSDN的教學
你目前是用SESSION就先用SESSION吧