2011-08-08 43 views
0

我有一些模型在我的MVC3網絡應用程序中,當用戶創建或編輯對象/實體時,需要設置「幕後」字段。MVC3,模型,創建和編輯隱藏字段

我想弄清楚什麼是最佳做法是關於這些類型的字段。

例如...

public class EntityA { 
    public int Id { get; set; } 
    public string Title { get; set; } 
    ... 
    [ForeignKey("User")] 
    public int UpdatedBy_Id { get; set; } 
    public virtual User UpdatedBy { get; set; } 
} 

的創建和編輯視圖這個允許用戶編輯「標題」領域,但「UpdatedBy」字段需要由應用程序設定當實體被插入或更新。

是否最好在視圖上放置一個隱藏字段並在其中設置「UpdatedBy_Id」,或使用模型屬性「get/set」主體來執行此操作? ...或者...應該在控制器的HttpPost上嗎?

+0

您不能使用用戶會話數據(通過成員資格或任何提供者)來檢索服務器中的updatedBy值嗎? – AJC

回答

0

我寧願在用戶控制之外放置這樣的字段。特別是如果它們是整數字段,用戶可以編輯以製作假記錄。然後選擇使用TempData(如果會話已啓用)或可能爲當前用戶即時檢索它。如果您不擔心用戶修改它們,那麼我會使用一個簡單的隱藏字段或將其放置在帖子的路徑值中,從而允許框架爲您完成工作。

+0

在這個特定的實例中,我可以從Session中提取值,我只是不知道在哪裏攔截實體和更新值。如果我爲導航屬性添加一個「set」主體,它希望我也添加「get」主體,並且我不知道這是我應該做的。 – Kizmar

+0

@Kizmar很好,如果你使用自動屬性,沒有get沒有任何值的集合。所以我不確定你在問什麼。由於該值可以從會話中提取,因此您可以讓框架爲您填寫用戶輸入,並且在持久化實體之前填寫剩餘的值。 –

+0

請原諒我對此的無知。 「在堅持實體之前你會填寫剩下的部分」部分是我困惑的地方。如果HttpPost發生時90%的屬性是由框架設置的,我在哪裏填寫其他10%?我試過在控制器的[HttpPost] Create(EntityA entity)方法中這樣做,但只要我試圖修改實體,我就會得到「一個實體對象不能被多個IEntityChangeTracker實例引用。 (例如,做一些像「entity.UpdatedBy_Id = 1;」) – Kizmar

0

我會說使用隱藏字段並設置UpdatedBy_Id。然後它會與表單一起發回,並且可以像其他信息那樣進行數據綁定。

+0

這個工程,只知道用戶可以使用Firebug或類似的更改隱藏字段的值... – Romias

1

這是DTOs(數據傳輸對象)派上用場的地方。

您的觀點使用DTO作爲模型。 DTO根據屬性鏡像實體對象,但不包括您不希望用戶能夠操作的屬性。

然後在您的控制器中,當您準備好堅持實體時,您將創建一個新的實體對象,並將DTO中的屬性傳遞給動作並將其複製到您的實體對象。現在您可以設置UpdatedBy屬性。

爲了使屬性從實體映射到DTO(反之亦然),您可以查看AutoMapper,如果您爲屬性使用相同的名稱,它將自動處理此問題。

如果您只是將實體傳遞給視圖,則用戶有可能更改您不希望它們能夠訪問的屬性的值。