我正在尝试找出一种更好的方式或模式,以便使用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和数据库访问的存储库模式
由于
答案 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"
)