在View for MVC中维护许多字段

时间:2014-06-19 20:07:03

标签: c# asp.net-mvc asp.net-mvc-5

我正在尝试找出一种更好的方式或模式,以便使用ASP.NET MVC从单个页面获取许多用户选择和输入。

问题 我在页面上有很多输入字段,我需要将它们的值存储在数据库中。

这是我的尝试: 我有一个页面,有一些部分视图。部分观点,我可以稍微分解一下。

为了论证,我在页面上有50个字段。其中一些是下拉列表,一些是文本输入字段,另一些是复选框。每个值都作为一行存储在数据库中,并由唯一的业务键访问。

例如,在使用Entity Framework访问我的数据访问实体时的代码中:

//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,Entity Framework,Linq和数据库访问的存储库模式

由于

1 个答案:

答案 0 :(得分:1)

看起来需要规范化。您的视图模型很乱,因为数据很乱。尝试在某些特殊情况下表示USER_SETTINGS的组/类别/类型,并在此基础上制作模型:" RegionalSettingsModel / ChargingOptionsModel"等。

如果需要,您还可以创建用于读取/更新每个模型的部分视图,并将它们全部放在一个视图中。

数据库中的表可以由多个模型表示。

此外,关于缺少列,您可以使用特定设置组所需的查询创建存储过程...示例

我认为你有:

表设置:

   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"
        )