2011-04-16 131 views
0

最初這將是一個問題,如何執行任務,但現在它已成爲最佳實踐問題。爲什麼MVC中Controller類的TryUpdateModel受到保護?

我正在使用MVC(對它還是新的),我試圖創建一個任何控制器可以調用的方法,它將運行一個通用的功能。在該方法中,我需要運行控制器的TryUpdateModel方法。這是我遇到了障礙的地方 - 除非方法在控制器中,否則我無法執行此操作,因爲TryUpdateModel由於其保護級別而無法訪問 - 它被標記爲「受保護」。如果我必須使這種方法對每個控制器都是私有的,那麼它將首先破壞方法的全部目的,並且我會複製粘貼很多代碼。

所以我想知道,爲什麼這種方法保護?當然,我一定會錯過顯而易見的東西。 (並請做棚燈)

我最終在創建自己的基類控制器類的控制器類時做了些什麼。這個新的類包含我需要的所有控制器通用的方法。現在我的控制器繼承自我構建的這個新的控制器類,而這個控制器類繼承自基礎控制器類。它運作良好,似乎很適合模型。

我的問題是 - 對於那些經常使用MVC的人來說,這是一個壞模式嗎?採取這樣一箇中心階級並且自己動手並使用它通常是一個糟糕的主意?

+0

描述你想要做將有助於人們理解這個問題更好 – gideon 2011-04-16 18:57:00

回答

1

這是受保護的,因爲這些方法屬於控制器代碼內部。它們是專門用於控制器的控制器的擴展。他們受到保護的事實意味着,通過設計意圖是在控制器中發生這種情況。以asp.net web表單爲例,Page.IsPostback是爲了從頁面本身調用。 控制器通常應用於模型綁定魔法的位置,因此TryUpdateModel也屬於此處。你可能會試圖簡化太多,但我明白你爲什麼要這麼做。你能抽象一層嗎?在您的控制器中使用tryupdatemodel,並在另一個「常用」方法中使用其他常見代碼。
通常在控制器的mvc代碼中保持相當簡單,如果!TryUpdateModel(model),那麼你只需返回並讓modelstate/validators發揮他們的魔力。它是一種簡單的方法,通常效果很好。通過嘗試實現這種其他方法,您是否節省了2/3行通用驗證代碼?

我不知道如果(因爲ModelState等)使用從控制器繼承的另一個類,其目的不是真正的控制器 - 在任何情況下都可以工作 - 所以要小心。 ModelState中可能無法正確傳來傳去,等

+0

亞當什麼一些基本的示例代碼,這差不多就是我一直在尋找。你所說的話是有道理的。該方法不僅僅是一對線,而且根據不同的條件,它會使用不同的參數調用TryUpdateModel,以便方法調用需要保留在函數中。不過,你的建議非常好,並鞏固了你的解釋。我認爲我最終採取的路線工作得很好,並且非常接近預期的模式。謝謝你的回答。 – KTF 2011-04-19 13:03:05

相關問題