2014-12-02 31 views
0

我還在學習如何使用MVC 5,到目前爲止,我設法讓自定義字段我在我的管理視圖頁面在這裏看到的用戶配置文件:發佈更新地址的數據庫MVC 5

http://puu.sh/ddmVY/2533472010.png

用戶註冊並填寫這些字段,它們存儲在與存儲用戶名和密碼數據相同的地方。 我在IdentityModels.cs增加這些領域的權利下ApplicationUser這裏看到

public class ApplicationUser : IdentityUser 
    { 

     // Additional user fields needed for registration 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Address { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
     public int ZipCode { get; set; } 


     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 
    } 

我希望能夠對地址進行修改,這樣,如果有人移動,他們可以自行更新。我有方法獲取數據並將它們放入ChangeAddress視圖中的文本框內,但是當需要更新數據時,我不知道如何去做。我不知道如何編寫這個post方法下面是這個頁面的樣子,我希望在ManageController.cs中的方法中添加它。我見過其他教程,它在單獨的表格上完成,但不是來自ApplicationUser的。

http://puu.sh/ddn98/96cab8a252.png

我的方法在ChangeAddress視圖頁面

// GET: /Manage/ChangeAddress 
     [HttpGet] 
     public async Task<ActionResult> ChangeAddress() 
     { 

      ApplicationUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

      var model = new ChangeAddressViewModel 
      { 
       Address = user.Address, 
       City = user.City, 
       State = user.State, 
       ZipCode = user.ZipCode 

      }; 
      return View(model); 
     } 
+0

是的,如果有人能夠提供更好的幫助,我仍然堅持我需要做的事情。如果改變了任何東西,我使用EF 6.0。 – Shido 2014-12-03 03:32:03

回答

0

您需要通過在模型中的東西,將讓您識別數據屬於當談到哪些用戶顯示的數據背部。將UserId屬性添加到ChangeAddressViewModel是最容易的。

當您向獲取請求發送請求時,您可以將其與ChangeAddressViewModel記錄中的其他數據一起傳回。然後這些信息通常以可通過POST提交的形式填充您的視圖。您通常會將UserId放入HiddenField中,以使其存在於窗體中但未顯示。

然後,您可以在您的控制器上創建一個具有[HttpPost]屬性的更新方法,該方法將ChangeAddressViewModel作爲其輸入參數,然後連接表單以便將提交提交到該更新操作。

在您的新更新方法。使用已傳回的userId找到所需的用戶。根據從POST傳入的ChangeAddressViewModel獲得的值設置該用戶的各種更新值。

在您的數據庫上下文中,爲您的用戶記錄調用SaveCnanges()以通過EF更新記錄。

There is a step by step tutorial for MVC on asp.net

+0

本教程鏈接是否仍適用於身份2.0相關的東西?我看到這樣的東西用於其它交方法如下: '[HttpPost] [ValidateAntiForgeryToken] 公共異步任務<的ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel模型)' 雖然教程顯示我: '[HttpPost] [ValidateAntiForgeryToken] public ActionResult編輯([綁定(包括=「ID,標題,ReleaseDate,流派,價格」)]電影電影) 也他們有這樣一行:'db.Entry(movie).State = EntityState .Modified;' 應用程序用戶將使用我使用的默認值如'db.Entry(ApplicationUser).State?' – Shido 2014-12-02 14:42:07

+0

同步方法調用d同步仍然適用 - 您只需根據需要選擇合適的方法即可。你可以傳入一個POCO(在這種情況下是一個ChangeAddressViewModel,你不必自己綁定它,只要你的表單數據的屬性與POCO上的屬性名稱匹配,它就會自動綁定。調用SaveChanges將更新狀態。 – 2014-12-04 08:43:01

0

最後,我設法幫助自己,並解決我的問題上來。在這裏發佈給任何有類似問題的人。

// 
    // POST: /Manage/ChangeAddress 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> ChangeAddress(ChangeAddressViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 

      // Get the current application user 
      var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 
      if (user != null) 
      { 
       //grab the details 
       user.Address = model.Address; 
       user.City = model.City; 
       user.State = model.State; 
       user.ZipCode = model.ZipCode; 

       // Update the user 
       var result = await UserManager.UpdateAsync(user); 
       if (result.Succeeded) 
       { 
        return RedirectToAction("Index", new { Message = ManageMessageId.ChangeAddressSuccess }); 
       } 
       AddErrors(result); 
       return View(model); 
      } 
     } 
     return View(model); 
    }