2010-08-09 25 views
3

似乎有多種方法將模型數據從asp.net mvc中的控制器傳遞到視圖。我不清楚在mvc v1和v2版本中是否有推薦的方法,或者如果像生活中的大多數事情一樣,這取決於它。我已經看到了幾種方法:如何決定將模型數據從asp.net mvc控制器傳遞到視圖的方式?

選項1 - 通過在視圖中強制類型化或以強類型方式通過創建強類型自定義模型類來填充控制器的ViewData dixtionary,或者使用基於字符串的索引方式填充控制器的ViewData dixtionary,以及通過ViewData傳遞。

選項2 - 使用ViewData.Model,我不知道我甚至不明白。

選項3 - 使用ViewPage.Model,在這種情況下,我不知道如何從控制器傳遞模型數據。

我見過很多帖子poo-pooing選項1和2,但我不明白爲什麼。這些帖子在大多數情況下似乎強烈推薦3。

你如何解決這個問題?有沒有標準的方法?

回答

2

每個視圖'應該'都有一個特定的模型。這有時會更多,所以人們會使用像ViewData這樣的快捷方式,但它在我看來並不那麼幹淨和安全,所以我更願意在視圖的模型中包含所有內容。

然後,您可以使所有視圖輸入不正確。這是一個非常乾淨的方式。然後在你的控制器,你只需要調用類的觀點:

YourViewModel model = new YourViewModel() 
{ 
    // initialize the data here 
}; 
View(model); 

然後在你的觀點,你可以通過ViewPageModel訪問所有的數據,它是所有類型的安全,從控制器執行爲好。從評論

編輯:

你並不需要使用ViewData可言,如果你不想要的。您可以將視圖需要的所有數據封裝在模型中。就像你用ProductsListViewData引用的例子。這只是一個模型,其中包含將要存儲在ViewData中的所有項目。這兩種方式都可以工作,但是當你把它封裝在一個類中(所有東西都在模型中的首選方法),那麼所有的零碎都是強類型的。

ViewData是一個通用的容器,所以即使你可以放入任何你想要的東西,它也不是類型安全的,因此不是'乾淨'的。這歸結於偏好和可維護性。只有選項1和3.您的選項2被誤解,實際上只是選項3。沒有ViewData.Model只是ViewPage.Model

+0

+1是靈活的,而不是說你總是需要一個強類型的模型。 – jfar 2010-08-10 00:13:24

+0

感謝您的好評。後續幾項:首先,您的YourViewModel類與ProductsListViewData類似,它在http://bit.ly/eWN6R的「方法2:傳遞ViewData使用強類型類」部分中顯示?其次,我的選項1和選項2都是指ViewData,但是當我通過ViewPage.ViewData [「whatever」]訪問ViewData和通過ViewData.Model訪問ViewData時,我不清楚這一點。 – Emilio 2010-08-10 00:55:12

+0

非常感謝,你完全清楚了這兩點。 – Emilio 2010-08-10 03:24:38

1

一種方法,就是要保留使用模型的輸入字段,並使用ViewData的支持視圖需要呈現的其他內容。

至少有一對夫婦的論據來支持這一點:

  1. 你有一個母版頁,需要一些數據存在(例如像頭中的StackOverflow的用戶信息)。應用站點範圍內的ActionFilter可以在每次操作後在ViewData中填充此信息。把它放在模型中需要站點中的每一個其他模型繼承自一個基礎模型(這可能起初看起來不好,但它可能會很快變得複雜)。

  2. 當您驗證發佈的表單時,如果存在驗證錯誤,您可能要重新綁定模型(使用無效字段)返回到視圖並顯示驗證消息。這很好,因爲輸入字段中的數據被回傳並綁定到模型,但是您的視圖需要重新填充的任何其他數據呢? (例如,下拉列表值,信息消息等)這些將不會被回傳,並且將它們重新填充到模型的「回傳」輸入值「周圍」可能變得混亂。使用..view數據填充ViewData的方法通常更簡單。

以我的經驗,我發現這種方法效果很好。

而且,在MVC3中,dynamic ViewModels意味着沒有更多的字符串索引!

+0

我完全同意。使用模型絕對一切都會變得非常混亂,非常難以實現。在適用的地方使用ViewData。他們沒有把它放在那裏,所以我們不會使用它。 – 2010-08-10 10:42:09

0

(我知道下面的答案是非常值得商榷的,但它只是我喜歡做的方式)

我會說使用ViewData的簡單數據的任務,並使用模型的主要目的視圖。退房羅布Conerys ViewData的輔助類在這裏給他們多一點的強類型的感覺:

http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

爲absolubtely一切使用模型做會增大你的項目有上百種型號,僅僅是實現最小的事。我的意思是如果你有一個用戶設置頁面,你通常會傳遞一個用戶模型到視圖中,但是如果你決定顯示一些相關的數據,例如與這個用戶相關的客戶。您被困在以下解決方案中

  1. 您可能必須將List屬性添加到User-model以便將客戶展示給視圖。這導致客戶屬性始終應用於項目中其他任何地方的用戶模型 - 或者創建一個新的更簡單的用戶模型。
  2. 創建一個新的操作,返回一部分客戶,您可以使用Html.RenderAction。

OR

你可以做計算機[ 「客戶」] = myRepo.GetCustomersRelatedTo(用戶); // 或類似的東西。

和(如果使用剝奪傭工)在您的視圖:

<%= Html.RenderPartial( 「CustomerList」,Html.ViewData( 「客戶」))%> 添加一個名爲PartialView是CustomerList IEnumerable的需要

我個人認爲這是一個清晰的解決方案,並確保 - 你結束了一個神奇的字符串,在這裏和那裏,但我會堅持這種做法,直到有人說明我不是一個單一的魔術字符串的項目。

使用我們在框架中的工具來完成工作。並保持簡單s ...;)

相關問題