2014-06-19 31 views
2

我想弄清楚使用ASP.NET MVC從單個頁面獲取許多用戶選擇和輸入的更好方式或模式。MVC中的許多字段維護

問題我有一個頁面上的許多輸入字段,我需要它們的值存儲在數據庫中。

這是我的嘗試: 我有一個單頁面,有一些局部視圖。有了部分觀點,我可以稍微分解一下。

爲了論證的緣故,我在頁面上有50個字段。其中一些是下拉式列表,一些是文本輸入字段,另一些是複選框。每個值都作爲一行存儲在數據庫中,並可通過唯一的業務密鑰訪問。

例如,在代碼中使用實體框架的訪問我的數據訪問實體時:

//Grouping of settings for a particular user 
var allSettingsForThisUser = myDbContext.USER_SETTINGS_MODEL.Where(u => u.USER_ID == userId); 

//Unique settings for a user 
var setting1 = allSettingsForThisUser.USER_SETTINGS_MODEL.Where(x => x.BUSINESS_KEY.Equals("FIELD1")).First(); 
var setting2 = allSettingsForThisUser.USER_SETTINGS_MODEL.Where(x => x.BUSINESS_KEY.Equals("FIELD2")).First(); 
var setting3 = allSettingsForThisUser.USER_SETTINGS_MODEL.Where(x => x.BUSINESS_KEY.Equals("FIELD3")).First(); 

..

我已經建立了視圖模型來保持屏幕上的每個設置在特定的地方。

我的視圖模型是這樣的:

public class MyViewModel 
{ 
    //Strongly typed fields for my view 
    public USER_SETTINGS_MODEL OrganizationType { get; set; } 
    public USER_SETTINGS_MODEL BookletsRequired { get; set; } 
    public USER_SETTINGS_MODEL HasGreenPants { get; set; } 
    public USER_SETTINGS_MODEL MiddleName { get; set; } 
    ... 
} 

這樣,我做的事情似乎並不高效。因此,對於每個字段,我需要通過特定的業務鍵來查詢數據庫。然後,我需要將其分配給特定的USER_SETTINGS_MODEL強類型字段。

我已經嘗試使用視圖模型與實體的集合。在我看來,我然後在WHERE條件中使用商業密鑰中的Linq查詢傳遞。結果是一個非常複雜的觀點。

我的問題是,有沒有更好的方法?一個更好的模式?

總結: - 很多領域的捕獲和保存 - 場被放置在特定的地方畫面 上 - 有些字段輸入框,某些下拉列表,一些複選框 - 我使用ASP.NET MVC5,實體框架,LINQ和數據連接的版本庫模式

感謝

+0

我想你的問題是db設計。此評論「每個值都作爲一行存儲在數據庫中,並可通過唯一的業務密鑰訪問。」令我感到震驚。它應該是每個OranizationType(具有許多字段)存儲在一個表中,並通過主鍵等訪問... – CSharper

+0

有點像一個表,有列ID,OrganizationType,BookletsRequired,HasGreenPants,MiddleName等我同意,但這意味着數據庫表中將存儲50列。如果我們添加一個字段,我們必須每次修改表格模式。 – c121hains

+0

** C鋒利:**你是對的。這裏問題的根源是數據模型。我目前的數據模型通過一個非常廣泛的結構可以提供很大的靈活性。這是一個很大的代價,這使得在處理Entity Framework中的強類型值時處理起來非常具有挑戰性,特別是使得事情變得棘手。我決定將我的數據重構爲更好的模型。 – c121hains

回答

1

它看起來像有需要正常化米你的觀點模型很混亂,因爲數據很混亂。嘗試在某些特殊情況下表示USER_SETTINGS的組/類別,然後根據它們製作模型:「RegionalSettingsModel/ChargingOptionsModel」等。

您也可以創建讀取/更新每個模型的部分視圖,並將它們全部放入一個查看你是否需要。

數據庫中的表可以由多個模型表示。

此外,關於缺少列,您可以創建存儲過程與您需要爲特定組設置的查詢...例如

我asume您有:

表設置:

USERID - SETTING - VALUE 
     1  - LANG - ENG 
     1  - CURR - DOLLAR 

爲了有一個實體,您可以創建:

存儲過程:

GetRegionalSettingsByUserID(Id) as 
    Select LANG, Curr from 
     (select Value from SETTINGS where USERID=Id and Setting="LANG" 
      UNION 
     select Value from SETTINGS where USERID=Id and Setting="CURR" 
     ) 
+0

您對數據的表示對我的情況而言是正確的。它會創建一個視圖,它將簡單地將列翻轉成行。正在使用行來提供最大的靈活性,以便可以在不更改模式的情況下添加或刪除字段。 – c121hains

+0

那麼,那麼,我們可以說,你可以用存儲過程創建實體工廠實現。看起來設計模式在.Net EF上有一個實現:http://www.codeproject.com/Articles/354501/Entity-Factory-Design-Pattern-for-NET。 – celerno

+0

這個問題真的是我如何組織我的數據。儘管靈活的結構允許隨意添加和刪除字段,但它使得工作非常具有挑戰性。將數據標準化以表示數據及其含義和關係更有意義。 – c121hains