2012-07-13 64 views
0

並非所有字段中的標準生成的代碼博克用於當所有字段都存在於編輯視圖響應編輯保存形式asp.mvc 4 EF的ActionResult編輯與在視圖

[HttpPost] 
public ActionResult Edit(User user) 
{ 
    if (ModelState.IsValid) 
    { 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
    } 
return View(user); 
} 

作品。

在我的模型中,我有一個密碼字段(出於顯而易見的原因),我不想作爲不可見的表單字段傳遞。 因此密碼爲空(這是預期的)。 我應該如何編碼來處理這種情況?

  1. 獲取密碼值,我應該從數據庫中獲取值嗎? 如果我使用:User u = db.User.Find(user.ID); EF有

  2. 「具有相同鍵的對象在ObjectStateManager已經存在」我怎麼解決ModelState.IsValid,因爲它是假的

我已經找到了以前版本的MVC問題的答案,但想知道實現這一目標的最優雅/有效的方式是什麼?

@freeride,surly我不必測試user.Password是否爲空,我希望它爲null,如果它不是那麼它是由惡意用戶注入的。整個excersie是爲了避免用戶操縱密碼。

刪除密碼字段(ModelState.Remove(「Password」);)確實解決了ModelState驗證問題。 現在仍然是問題,我該如何恢復密碼值?以下工作:

[HttpPost] 
public ActionResult Edit(user user) 
{ 
    user v = db.Users.Find(user.ID); 
    ModelState.Remove("Pass"); 


    user.Password = v.Password;   // assign from db 

    if (ModelState.IsValid) 
    { 

     //db.Entry(user).State = EntityState.Modified; // this won't work as the context changed 
     db.Entry(v).CurrentValues.SetValues(user); // we need to use this now 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(user); 
} 

我不知道如果我不得不做一個額外的分貝之旅​​,以獲取價值?我必須更改代碼來修復EF上下文更改,它的工作原理,但代碼是正確的?

+0

你能否在這裏粘貼你的視圖代碼...我認爲如果你從你的視圖中刪除你的密碼字段,在保存時應該沒有任何問題 – 2012-07-13 11:09:38

+0

你應該使用視圖模型。 – 2012-07-13 11:49:09

+0

@ patel.milanb,視圖中沒有密碼字段,因爲我將其刪除。 – 2012-07-13 18:38:06

回答

2

之前

if (ModelState.IsValid) 

添加

if (string.IsNullOrEmpty(user.Password)) 
{ 
    ModelState.Remove("Password"); 
} 

我不知道如果我不得不這樣做額外的分貝之旅​​,以獲取價值?我 不得不改變代碼來修復EF上下文的變化,它的工作原理,但是 的代碼是正確的?

以不同的方式做。不要將實體對象用作模型。 創建其中只包含您需要更新數據,例如模型:

public class UserModel 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 
} 

現在:

[HttpPost] 
public ActionResult Edit(UserModel userModel) 
{ 

    if (ModelState.IsValid) 
    { 
     User user = db.Users.Find(userModel.Id); 
     user.FirstName = userModel.FirstName ; 
     user.Surname = userModel.Surname; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(userModel); 
} 

我希望它能幫助。