2013-10-07 25 views
0

我製作了一個MVC 3網站,允許用戶在線註冊和購買東西。我使用EF進行所有數據庫操作。我對用戶類實現如下更新幾個更改的字段MVC 3項目

public class User 
{ 
    [HiddenInput(DisplayValue = false)] 
    public long UserID { get; set; } 

    [Required(ErrorMessage = "Please enter a first name")] 
    [Display(Name="First Name")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Please enter a last name")] 
    [Display(Name="Last Name")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Please enter an Email")] 
    [RegularExpression(".+\\@.+\\..+", ErrorMessage="Please enter a valid email")] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "Please enter a phone number")] 
    [Display(Name = "Phone Number")] 
    public string PhoneNumber { get; set; } 

    [Required(ErrorMessage = "Please enter a value for address line 1")] 
    [Display(Name = "Address Line 1")] 
    public string AddressLine1 { get; set; } 

    [Required(ErrorMessage = "Please enter a value for address line 2")] 
    [Display(Name = "Address Line 2")] 
    public string AddressLine2 { get; set; } 

    [Required(ErrorMessage = "Please enter a city")] 
    [Display(Name = "City")] 
    public string City { get; set; } 

    [Required(ErrorMessage = "Please enter a country")] 
    [Display(Name = "Country")] 
    public string Country { get; set; } 

    [Required(ErrorMessage = "Please enter a login name")] 
    [Display(Name = "Your Login Name")] 
    public string UserName { get; set; } 

    [Required(ErrorMessage = "Please enter a password")] 
    [DataType(DataType.Password)] 
    [Compare("Password")] 
    [Display(Name = "Your Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Compare("Password", ErrorMessage="Passwords do not match")] 
    [System.ComponentModel.DataAnnotations.Schema.NotMapped] 
    [Display(Name = "Confirm Password")] 
    public string ConfirmPassword { get; set; } 
} 

現在,我面對的是在更新用戶信息的問題。我希望我會提供兩個不同的頁面來更新細節。一個用於更改密碼,另一個用於更改其他詳細信息。但是,問題是當我創建一個視圖來啓用編輯其他細節,驗證密碼激發,並且不允許我保存數據。我希望沒有顯示的字段的數據與存儲在數據庫中的數據相同。

請幫助我,因爲這是我的第一個問題,請告訴我有關解決我的問題需要解決的其他問題。下面是用戶控制編輯動作代碼:

public ViewResult Edit(int userId) 
    { 
     User user = repository.Users.Where(x => x.UserID == userId).Select(x => x).FirstOrDefault(); 
     user.UserName = repository.Users.Where(x => x.UserID == userId).Select(x => x.UserName).FirstOrDefault(); 
     return View(user); 
    } 

    [HttpPost] 
    public ActionResult Edit(User user) 
    { 
     //user.Password = repository.Users.Where(u => u.UserName.Equals(user.UserName)).Select(p => p.Password).FirstOrDefault().ToString(); 
     user.ConfirmPassword = user.Password; 

     if (ModelState.IsValid) 
     { 
      repository.AddUser(user, "Edit"); 
      TempData["message"] = string.Format("{0} has been saved", (user.FirstName+ " " +user.LastName)); 
      return RedirectToAction("ListUsers", "User"); 
     } 
     else 
     { 
      return View(user); 
     } 
    } 

下面是查看代碼的編輯用戶

@model SportsStore.Domain.Entities.User 

@{ 
    ViewBag.Title = "Edit User"; 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
} 

<h2>Edit @Model.FirstName @Model.LastName</h2> 

@Html.ValidationSummary() 

@using (Html.BeginForm("Edit", "User", FormMethod.Post)) 
{ 

<table class="Grid"> 
    <tr> 
     <td>First Name</td> 
     <td>@Html.EditorFor(x => x.FirstName)</td> 
    </tr> 
    <tr> 
     <td>Last Name</td> 
     <td>@Html.EditorFor(x => x.LastName)</td> 
    </tr> 
    <tr> 
     <td>Email</td> 
     <td>@Html.EditorFor(x => x.Email)</td> 
    </tr> 
    <tr> 
     <td>Phone Number</td> 
     <td>@Html.EditorFor(x => x.PhoneNumber)</td> 
    </tr> 
    <tr> 
     <td>Address Line 1</td> 
     <td>@Html.EditorFor(x => x.AddressLine1)</td> 
    </tr> 
    <tr> 
     <td>Address Line 2</td> 
     <td>@Html.EditorFor(x => x.AddressLine2)</td> 
    </tr> 
    <tr> 
     <td>City</td> 
     <td>@Html.EditorFor(x => x.City)</td> 
    </tr> 
    <tr> 
     <td>Country</td> 
     <td>@Html.EditorFor(x => x.Country)</td> 
    </tr> 
</table> 
@*Html.EditorFor(x => x.UserName) 
@Html.PasswordFor(x => x.Password) 
@Html.HiddenFor(x => x.ConfirmPassword) 

@*{Model.ConfirmPassword = Model.Password;}*@ 

<input type="submit" value="Save" /> 
if (User.Identity.Name.Equals("admin", StringComparison.OrdinalIgnoreCase)) 
{ 
    @Html.ActionLink("Cancel and return to User List", "ListUsers"); 
} 
else 
{ 
    @Html.ActionLink("Cancel and return to User List", "List", "Product"); 
} 
} 

回答

2

你應該分成ViewModels,一個這種含有用戶登錄信息,UserLoginViewModelUserInfoViewModel,僅包含其他用戶信息。只需添加到每個模型只需要屬性更新,以下爲例的UserLoginModelo

public class UserLoginViewModel 
{ 
    [HiddenInput(DisplayValue = false)] 
    public long UserID { get; set; } 

    [Required(ErrorMessage = "Please enter a password")] 
    [DataType(DataType.Password)] 
    [Compare("Password")] 
    [Display(Name = "Your Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Compare("Password", ErrorMessage="Passwords do not match")] 
    [System.ComponentModel.DataAnnotations.Schema.NotMapped] 
    [Display(Name = "Confirm Password")] 
    public string ConfirmPassword { get; set; } 
} 

基於這個模型然後,創建強類型的意見。該控制器應該期望每個視圖模型,那麼你可以每一個atributte映射到真正的用戶對象,然後保存所有修改:

查看:

@model SportsStore.Domain.Entities.UserLoginViewModel 

控制器:

[HttpPost] 
public ActionResult Edit(UserLoginViewModel user) 
{ 
    //Retrieve the user and map every updated property to the original User 
} 

[HttpPost] 
public ActionResult Edit(UserInfoViewModel user) 
{ 
    //Retrieve the user and map every updated property to the original user 
} 
+0

謝謝您回答。有沒有辦法在我可以使用q單視圖模型?分裂他們是最後的手段。 – Bodhi