Tôi đã bắt đầu một dự án ASP.NET MVC 2 và tôi đang xây dựng mã được tạo tự động.Cách tải cấu hình của người dùng mới đăng nhập trước khi chuyển hướng
Sự cố mà tôi đang gặp phải là sau khi người dùng đăng nhập, có vẻ như hồ sơ của người dùng mới đăng nhập không được tải vào HttpContext
, vì vậy tôi nhận được ProviderException
với thông báo "Thuộc tính này không thể được đặt cho người dùng ẩn danh "khi cố đặt giá trị thuộc tính trong tiểu sử của người dùng hiện tại.
Đối với hành động Logon POST-chỉ, Visual Web Developer 2010 Express về cơ bản được tạo ra:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.UserName, model.Password))
{
FormsService.SignIn(model.UserName, model.RememberMe);
//...
nơi FormsService
là một tài sản của bộ điều khiển kiểu FormsAuthenticationService
(cũng tạo ra):
public class FormsAuthenticationService : IFormsAuthenticationService
{
public void SignIn(string userName, bool createPersistentCookie)
{
if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
}
public void SignOut()
{
FormsAuthentication.SignOut();
}
}
Sau dòng FormsService.SignIn(model.UserName, model.RememberMe)
tôi giả định rằng thông tin cho tài khoản mới đăng nhập sẽ có sẵn ngay lập tức cho bộ điều khiển, nhưng điều này có vẻ không đúng. Ví dụ: nếu tôi thêm profile.SetPropertyValue("MyProfileProperty", "test")
bên dưới cuộc gọi vào FormsService # SignIn, thì tôi nhận được số ProviderException
"Không thể đặt thuộc tính này cho người dùng ẩn danh".
Làm cách nào để tải tiểu sử của người dùng mới đăng nhập vào HttpContext
để tôi có thể đặt giá trị thuộc tính trong tiểu sử của họ trước yêu cầu tiếp theo?
Điều đó sẽ tạo một hồ sơ mới, không tải hồ sơ hiện có. –
Không, bạn sai khi giả định rằng, nó sẽ tải một hồ sơ hiện có. Hãy dùng thử. –
"Mất một thời gian cho đến khi tôi nhận ra rằng việc gọi ProfileBase.Create() với một tên người dùng làm đối số thực hiện tra cứu đối với TableStorage và thực sự truy xuất dữ liệu liên quan đến tên người dùng đó. Như tôi đã nói, gọi phương thức này Create() là sai lầm, tôi mong đợi Load() hoặc Get(). " xem câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –