2011-06-21 47 views
0

在我的控制器MVC中,我有一個Action來顯示我的模型(具有3個字段[代碼],[Libelle]和[IsActif])的通用模型。在模型上添加動態只讀屬性

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
[ActionName("AfficheDetailMotifRejet")] 
[AuthorizeRoleFilter(Roles = TypeRoles.Roles.ADMINISTRATEUR_NATIONAL)] 
public ActionResult AfficheDetailMotifRejet([DefaultValue(Int64.MinValue)] Int64 id) 
{ 
    DetailGeneric dg = new DetailGeneric { Id = id }; 

    if (id > 0) 
    { 
     MotifRejet s = _srvMotifRejet.Charger(id); 
     Mapper.CreateMap<MotifRejet, DetailGeneric>(); 
     dg = Mapper.Map<MotifRejet, DetailGeneric>(s); 
    }    

    return View("GererMotifRejet", dg); 
} 

如果我發送Int64.MinValue作爲Id,那麼我的模型顯示爲空,準備插入。 但是,當我顯示編輯與一個存在的ID,我需要在ReadOnly模式下的字段[代碼]。

什麼是最佳解決方案?

我想在dg.Code中添加[ReadOnly(true)]屬性,但是如何做到這一點?

不過,我可以用javascript做成這個,但是如果用戶沒有激活javascript,就有風險。

感謝您的幫助。

+2

屬性是用代碼編譯並存儲在dll中的常量值 - 這意味着您在技術上不能在運行時「更改」屬性的值,除非您在運行時生成並編譯代碼。你可能會想要另一種方式來實現同樣的事情,而不用關注屬性。 –

回答

2

您不能在運行時設置屬性(例如在「代碼」中)。

您最好的選擇是要創造包裹編輯視圖模型,並創建模式,然後做1兩件事情:

1)做一個@if (Model.IsEditMode)檢查,如果真呈現出兩種@Html.EditorFor,或者@Html.DisplayFor如果爲false

2)創建一個綁定到模型的HTML助手,該模型檢查模型數據並根據相同的值調用上述助手之一。

無論哪種方式,如果您想相應地做出決定,您需要某種「基本」視圖模型用於創建和編輯視圖。

+0

謝謝。我正在使用第一個解決方案,它運行良好。 –

0

我認爲可以在運行時使用custom metadata provider來提供模型元數據,但這是錯誤的(解決方法將是太複雜)的方法來解決這個問題。

我只是確保在模型後http實體是可編輯的,並避免渲染編輯相關的東西@客戶端。