2011-02-15 41 views
1

我正試圖在一個簡單的內容管理網站內執行crud操作。在嘗試爲輸入內容創建我的CRUD視圖時,需要填充幾個下拉列表,並且在編輯操作的情況下,他們需要預先選擇特定的值。我一直在閱讀一本教科書,並儘可能通過網絡上的文章吸收,但我在確定屬於這些下拉菜單的信息的最佳位置時遇到了麻煩。我可以很容易地創建模型類來識別它們,然後我可以選擇讓數據一次填充一個,或者將這些信息填充爲內容模型類中的屬性,以便選擇類的值,但IEnumerable屬性可用於直接綁定。什麼是CRUD的首選模型配置?

無論哪種方式似乎與使用模板來創建下拉菜單,但我試圖消除一些單獨檢索這些事情的「選擇N + 1」問題,但我也不想將我的模型裝滿了太多垃圾,這些垃圾根本不屬於MVC體系結構。

所以基本的問題是:有沒有喜歡的下拉列表,過濾器等輔助信息屬於作爲子類在主模型類或應該將這些單獨檢索並呈現由自己獨立的項目?還是應該使用架構的其他方面,我只是完全錯過了船?

文章,鏈接,重定向都歡迎。我搜索了這個,我發現的或者沒有回答這個問題,或者答案隱藏在大量的結果中。

+0

你能舉一個你的類的例子嗎? – 2011-02-15 19:31:03

+0

@Daniel T. - 此刻我還沒有寫任何東西。我在繪製圖表和通過示例/教程時遇到了這個問題。 – 2011-02-15 20:49:29

回答

1

示例:書籍和作者實體 在視圖中創建新書時,您需要一個選擇控件,其選項已填充爲所有可用的作者。

Book模型應該是乾淨的並且只包含相關的字段,例如標題,作者

控制器應該有一個IAuthorRepository _authorRepository;字段可能已由DependencyResolver設置或在控制器構造函數中手動設置。 IAuthorRepository將有一個方法,如IEnumerable GetAvailableAuthors();

的[HTTPGET] Create()行爲可直接返回一個空的圖書模型,然後將東西進入_authorRepository動態ViewBag。 ViewBag.AuthorRepository = _authorRepository;然後

的視圖會通過ViewBag.AuthorRepository到的局部視圖或自定義編輯器。在這種情況下,您的模型保持清潔。

有些人不喜歡任何使用ViewBag.Xxx(或計算機[「XXX」]),因爲它是不完美的MVC。我見過的例子會創建一個像BookViewModel這樣的新類型。然後,BookViewModel將自身包含Book和IAuthorRepository。然後[HttpGet] Create()操作將返回一個BookViewModel對象,並且該視圖將通過傳遞model.AuthorRepository而不是ViewBag.AuthorRepository來呈現其作者選擇部分視圖。這種開始看起來更像MVVM而不是MVC。你的本能使任何這樣的集合或存儲庫脫離實際模型(Book)是正確的。一個乾淨的模型是非常重要的,並會給你在任何模式最靈活。

0

不知道這是否是你之後,但我使用一個名爲Web.Shared我自己的類庫持有我所有的輔助方法的東西。我有一個SelectListHelper類,我用它來填充我所有的下拉列表。這樣我的代碼就可以從主域模型中分離出來,並且可以通過這個和任何其他MVC應用程序重用,這是我解決方案的一部分。

// Return days of the month for a dropdownlist 
public static class SelectListHelper 
{ 
    public static SelectList DayList() 
    { 
     return NumberList(1, 31); 
    } 
} 

// Use in view 
@Html.DropDownListFor(m => m.Day, SelectListHelper.DayList()) 

// Another one for selecting genders 
public static SelectList GenderList(string selectedValue = null) 
{ 
    IList<KeyValuePair<string, string>> genders = new List<KeyValuePair<string, string>>(); 
    genders.Insert(0, new KeyValuePair<string, string>("F", "Female")); 
    genders.Insert(0, new KeyValuePair<string, string>("M", "Male")); 
    genders.Insert(0, new KeyValuePair<string, string>("", "Choose Gender")); 
    return new SelectList(genders, "Key", "Value", selectedValue); 
} 

// Use in my edit view 
@Html.DropDownListFor(m => m.Gender, SelectListHelper.GenderList()) 

如果不能這樣做,請參閱MVC Scaffolding以創建數據綁定的CRUD視圖。

+0

這不完全是我的下拉菜單。礦井是通過數據庫中的信息(如類別)創建的。無論如何,必須有一些東西將它們從數據庫中拉出來,但是把它們放在哪裏就成了問題。我正在閱讀有關腳手架的問題,這讓我質疑我目前使用的方法。 – 2011-02-15 20:23:07

0

我同意重刑的答案,但我的回答可以不適合評論。

首先,簡單的解決方案,如果你正在使用NHibernate:在具有一對多的集合,你可以設置批量加載在一個查詢許多實體(而不是N!)。我們使用100的批量處理,性能提升非常明顯。如果您只是從單個表中加載所有內容,這將無濟於事。

現在棘手,但還是非常值得的解決方案。

如果你有一個被經常查詢相對靜態的內容(下拉列表,帳戶名稱查找,等等),你應該認真考慮一下在內存中緩存它。如果您使用IOC,則可以非常容易地將CachingRepository實現交換爲IRepsoitory <>。在我的公司,我們從FubuMVC借了FubuCache,但我認爲這只是幕後的一本字典。如果您有一個服務器場或多個服務器訪問相同的數據,則可以使用Memcached共享數據。

有關緩存重要的是知道何時將其清除。 (即從數據庫中重新加載內容)。對於我們來說,這意味着

1)每5分鐘不管是什麼(其他應用程序與db進行交互,因此我們需要接受它們的更改。插入或更新我們清除所有相關的緩存。

由於大多數我們的應用程序與許多報告過大的數據集加入我們緩存幾乎一切。只要你的服務器有足夠的RAM,你就會好起來的。

ps http://axisofeval.blogspot.com/2010/11/numbers-everybody-should-know.html

相關問題