2012-09-18 50 views
0

我正在使用MVC3和EF4編寫Web應用程序。我使用下面的動作頭來捕獲用戶提交的表單值。如何防止用戶修改表單上的某些字段?

<HttpPost()> 
Public Function Edit(ByVal prod as Product) As ActionResult 

我使用下面的代碼來更新記錄。

db.Attach(prod) 
db.ObjectStateManager.ChangeObjectState(prod, EntityState.Modified) 
db.SaveChanges() 

我得到prod對象中提交的值,我在數據庫中更新。問題是有些用戶不允許修改產品中的某些字段,比如ProductCost。我禁用了HTML中這些字段的文本框。但由於它是客戶端,用戶可以使用Firebug等工具輕鬆啓用它並修改其值。

我能想出的唯一解決方案是從數據庫中檢索現有記錄,並將其ProductCost值複製到prod.ProductCost中。但我不喜歡解決這個問題。有沒有更好的方法來實現這一目標?

編輯:我發現下面的鏈接來更新特定的字段。 How to update only one field using Entity Framework?

您可以使用下面的代碼來修改特定的字段。

context.ObjectStateManager.GetObjectStateEntry(user).SetModifiedProperty("FieldName"); 

現在的問題是,我必須爲用戶能夠修改的每個字段編寫上述語句嗎?如果是,假設產品模型有10個字段(1個主鍵),並且允許用戶修改除主鍵以外的所有鍵,我需要寫9條語句有沒有一種方法可以一次指定多個屬性。或者甚至更好的是指定未修改的屬性。 (注意:我知道我可以對一個字段名稱進行循環,以避免寫出9條語句,我要求一種替代方法,而不是重構上述內容)

回答

2

永遠不要信任客戶端數據。始終讓您的服務器代碼驗證輸入並執行相應的操作。

我會創建單獨的重載我的呼吸方法,更新方式不同的產品,然後檢查什麼是當前用戶的訪問類型,如果他是管理員,我會打電話給其更新都超載,如果他是一個的經理,我會打電話給這名更新,IMAGEURL和價格的方法,如果他是一個員工,我會打電話給其僅更新名稱和IMAGEURL

[HttpPost] 
public ActionResult Edit(Product prod) 
{ 
    if(ModelState.IsValid) 
    { 
    string userType=GetCurrentUserTypeFromSomeWhere(); 
    if(userType=="admin") 
    { 
     repo.UpdateProduct(prod); 
    } 
    else if(userType=="manager") 
    { 
     repo.UpdateProduct(prod.ID, prod.Name, prod.ImageUrl, prod.Price); 
    } 
    else if(userType=="employee") 
    { 
     repo.UpdateProduct(prod.ID, prod.Name, prod.ImageUrl); 
    } 
    return RedirectToAction("Updated",new {id=prod.ID}); 
    } 

} 
+0

我用下面的代碼更新記錄的方法。 db.Attach(模型) db.ObjectStateManager.ChangeObjectState(型號,EntityState.Modified) db.SaveChanges() 我的上下文對象不具有像的UpdateProduct任何方法。 – Cracker

+1

@Cracker您必須從db中加載現有產品,然後(基於usertype)只更新用戶有權訪問的字段。這就是Shyju的repo.UpdateProduct(...)會在幕後做的事。 – ZippyV

+0

好的..那麼我已經知道這種方法..我要求的替代品 – Cracker

相關問題