2012-06-07 67 views
1

我想實現一個要求,允許我根據用戶角色或其他業務邏輯來更改html控件的狀態。例如,某些用戶不應該能夠編輯某個模型屬性,或者在某些情況下,我甚至不希望控件呈現給html DOM。我可以在操作過濾器中修改模型元數據嗎?

在HTML幫助程序中,元數據可以告訴幫助程序是否呈現控件或可以使其成爲只讀/禁用。我不想在這裏重新發明輪子,我只想通過在運行時基於邏輯在動作過濾器中更改元數據來使用已有的元素。我不希望這種邏輯在我看來,我不想爲每個單獨的html控件創建自定義助手,如果我不必..

我想要做的是創建一個操作過濾器來處理評估業務層中的邏輯規則,然後更改給定model.property的元數據。

問題是,我對元數據的修改似乎沒有將其添加到視圖中。它幾乎看起來像我對動作過濾器中的元數據的更改不是通過引用,所以我不修改用於視圖的同一個實例?

public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
    var trans = filterContext.Controller.ViewData.ModelMetadata.Properties.Where(e => e.PropertyName == "Transaction").FirstOrDefault(); 
    trans.DisplayName = "Show FOO!"; 
} 

我在做什麼錯?

回答

1

不能在實際上是一個過濾器改變ModelMetadata.Properties值,你不能改變他們在衆人面前的作用是評估服務器端。

的問題是內部內置的DataAnnotationsModelMetadataProvider(準確地說AssociatedMetadataProviderGetMetadataForProperties法)namelly的ModelMetadata.Properties會從屬性每次迭代它的時候再生。

因此,ModelMetadata.Properties集合中的項目是不可變的。

你可以調試一下:

public override void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
    var properties = filterContext.Controller.ViewData.ModelMetadata.Properties 
    var trans1 = properties.Where(e => e.PropertyName == "Transaction").First(); 
    trans1.DisplayName = "Show FOO!"; 
    var trans2 = properties.Where(e => e.PropertyName == "Transaction").First(); 
} 

trans1trans2將是不同的實例(你可以檢查自己的散列碼),所以trans2顯示名稱將原來的顯示名稱不是「顯示FOO!」。

所以你需要擴展/寫一個新的MetadataProvider來實現你的目標。

+0

謝謝,經過一些試驗和錯誤後我發現了這一點。我最終做的是創建一個自定義的元數據提供程序,它允許我根據需要修改屬性。 – JBeckton

0

您可以檢查用戶在視圖中的角色並進行調整。渲染HTML

@if(HttpContext.Current.User.IsInRole("MyRole")) { 
    <input type='text' id='txtSomeInput' /> 
} 
+0

這正是我想要做的。與用戶角色方面不同的是,我們還有一些其他邏輯可以確定今年某些數據是否可用於編輯,而不是去年。以前的開發者一直在把if語句放在這個地方來處理這個問題。現在,當新的一年到來時,代碼必須在50個左右的地方更新,以便邏輯將考慮新的一年。從一年到下一年,我們的獎學金申請可能會要求提供不同的信息,但該視圖和模型仍需要支持查看/編輯上一年的申請數據。 – JBeckton

+0

我現在看到...每個新年的局部視圖怎麼樣?你的獎學金模式保持不變,但你有一本字典<年,獎學金>。然後在2012年第一季度,你通過字典獎學金[2012]。我很難考慮一種方法,即使用一種視圖,每種視圖在每年都沒有所有if語句的情況下啓用或刪除不同的字段。 –

+0

只要他們不在視野中,我不介意if語句。我想集中這個維護邏輯。這就是爲什麼我想操縱元數據,以便HTML幫助者可以做他們已經做的事情,我不需要在那裏做任何改變。我正在查看自定義元數據提供程序以查看是否有任何區別。 – JBeckton

相關問題