Много полей, которые нужно поддерживать в поле зрения для MVC

#c# #asp.net-mvc #asp.net-mvc-5

#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 строго типизированному полю.

Я попытался использовать модель представления с коллекцией объектов. На мой взгляд, затем я использую передачу запроса Linq в бизнес-ключах в условии WHERE . В результате получилось очень сложное представление.

Мой вопрос в том, есть ли лучший способ? лучший шаблон?

Вкратце: — множество полей для захвата и сохранения — поля размещаются в определенных местах на экране — некоторые поля представляют собой поля ввода, некоторые выпадающие списки, некоторые флажки — я использую ASP.NET MVC5, Entity Framework, Linq и шаблон репозитория для доступа к данным

Спасибо

Комментарии:

1. Я думаю, что ваша проблема заключается в дизайне БД. Этот комментарий «Каждое значение хранится в базе данных в виде строки и доступно по уникальному бизнес-ключу» вызывает у меня тревогу. Должно быть, каждый OranizationType (со многими полями) хранится в таблице и доступен по первичному ключу и т.д…

2. Что-то вроде таблицы, в которой есть столбцы ID, OrganizationType, BookletsRequired, HasGreenPants, MiddleName и т.д. Я согласен, но это означает, что в таблице базы данных будет храниться 50 столбцов. Если мы добавляем поле, нам приходится каждый раз изменять схему таблицы.

3. C Sharper: вы правы. Корень проблемы здесь — модель данных. Моя текущая модель данных обеспечивает большую гибкость благодаря очень обобщенной структуре. Это требует больших затрат, что усложняет работу и особенно усложняет работу со строго типизированными значениями в Entity Framework. Я решил преобразовать свои данные в лучшую модель.

Ответ №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"
        )
 

Комментарии:

1. Ваше представление данных верно для моей ситуации. Было бы неплохо создать представление, которое просто меняло бы строки со столбцами. Строки используются для обеспечения максимальной гибкости, так что поля могут быть добавлены или удалены без изменения схемы.

2. Что ж, тогда многие мы можем сказать, что вы можете создать реализацию фабрики сущностей с процедурами хранения. Похоже, что этот шаблон проектирования имеет реализацию в .Net EF: codeproject.com/Articles/354501 /.

3. Проблема действительно в том, как я структурировал свои данные. Хотя гибкая структура, позволяющая добавлять и удалять поля по желанию, делает работу действительно сложной. Имеет смысл больше нормализовать данные, чтобы представить данные, их значение и взаимосвязи.