Динамические (генерируемые во время выполнения) формы в ASP.NET MVC [закрыто]

Поскольку вы спрашиваете в контексте приложения facebook, возможно, вам стоит подумать об обнаружении этого на сервере при первоначальном запросе. Facebook будет передавать кучу данных запроса, включая ключ fb_sig_user, если он вызывается из iframe.

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

24
задан Robert Claypool 28 December 2015 в 21:17
поделиться

4 ответа

Другой вариант - иметь очень слабо связанную схему базы данных.

//this will contain all the fields and types that the admin user sets
**ApplicationFields**
FieldName
FieldType
...

//these are all the values that have some mapping to a ParentObjectID
**FormValues**
ParentObjectID
FieldName
FieldValue

Когда вы отправляете сгенерированный во время выполнения View (из ApplicationFields), просто прокрутите свою коллекцию FormCollection и попробуйте установить ее в ParentObject вам нужно обновить.

public ActionResult MyForm(FormCollection form)
{
    //this is the main object that contains all the fields
    var parentObject;

    foreach (string key in form)
    {
        parentObject.SetValue(key, form[key]);
    }
    ...

Тогда ваш parentObject может быть примерно таким ...

public partial class ParentObject
{
    IList _FormValues;

    public void SetValue(string key, string value)
    {
        //try and find if this value already exists
        FormValue v = _FormValues.SingleOrDefault(k => k.Key == key);

        //if it does just set it
        if (v != null)
        {
            v.Value = value;
            return;
        }

        //else this might be a new form field added and therefore create a new value
        v = new FormValue
        {
            ParentObjectID = this.ID,
            Key = key,
            Value = value
        };

        _FormValues.Add(v);
    }
}
3
ответ дан 29 November 2019 в 00:21
поделиться

Один из способов сделать это - создать свой собственный ModelBinder , который будет лежать в основе ваших сгенерированных форм. Modelbinder отвечает за проверку ModelState и восстановление типизированной ViewDataModel (при условии, что ваши представления типизированы).

Связыватель модели DataAnnotations может быть хорошим справочником для этого. Это настраиваемое средство связывания модели позволяет вам делать через Атрибуты в вашем ViewDataModel , описывающие проверку атрибута (и намек на рендеринг пользовательского интерфейса). Однако все это определено во время компиляции, но было бы отличным справочником для начала написания пользовательского связывания модели.

В вашем случае связыватель модели должен получать валидацию для поля во время выполнения из файла / строки xml.

Если у вас есть такой маршрут:

routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),

Затем вы можете найти правильный xml формы в FormsController.Index (string formName) и передать его представлению.

FormsModel должен содержать все возможные методы для получить данные, я не вижу другого пути. Xml может отображаться на имя функции (возможно, даже с аргументами), которое вы можете вызвать с помощью отражения на FormsModel для заполнения ViewData или набрать ViewDataModel данными.

Представление для индекса формы может сгенерировать форму из этого xml через расширение HtmlHelper , которое принимает XmlDocument .

Затем, когда вы (или asp. net mvc) связывает вашу форму с вашими ViewData , когда вызывается ваш пользовательский связыватель модели, он может проверять текущие значения контроллера для поиска formName и поиска соответствующего xml, содержащего все правила проверки. ModelBinder затем отвечает за заполнение ModelState любыми ошибками, определенными во время выполнения.

Это сложная задача, но, если ее выполнить успешно, на мой взгляд, она того стоит :)

Обновление Лучшей альтернативой модельным данным будет очень свободная схема базы данных, как предлагает Дэвид Лиддл. Я бы все равно сохранил его как xml (или какой-либо другой сериализованный формат) и использовал его для создания представления и хранения правил проверки для пользовательского ModelBinder , чтобы у вас было больше контроля над макетом и проверка каждого поля.

Это сложная задача, но, если ее выполнить успешно, на мой взгляд, она того стоит :)

Обновление лучшей альтернативой модели данных была бы очень свободная схема базы данных, как предлагает Дэвид Лиддл. Я бы все равно сохранил его как xml (или какой-либо другой сериализованный формат) и использовал его для создания представления и хранения правил проверки для пользовательского ModelBinder , чтобы у вас было больше контроля над макетом и проверка каждого поля.

Это сложная задача, но, если ее выполнить успешно, на мой взгляд, она того стоит :)

Обновление лучшей альтернативой модели данных была бы очень свободная схема базы данных, как предлагает Дэвид Лиддл. Я бы все равно сохранил его как xml (или какой-либо другой сериализованный формат) и использовал его для создания представления и хранения правил проверки для пользовательского ModelBinder , чтобы у вас было больше контроля над макетом и проверка каждого поля.

1
ответ дан 29 November 2019 в 00:21
поделиться

Ответ коттсака очень привлекателен.

Существует как минимум два механизма XForms на стороне клиента. Вот один:

https://community.emc.com/community/edn/xmltech

0
ответ дан 29 November 2019 в 00:21
поделиться

У меня было то же самое нужно в недавнем проекте. Я создал класс библиотеки для этого. Я только что выпустил новую версию библиотеки.

Может быть, это может помочь вам: ASP.NET MVC Динамические формы

12
ответ дан 29 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: