Поскольку вы спрашиваете в контексте приложения facebook, возможно, вам стоит подумать об обнаружении этого на сервере при первоначальном запросе. Facebook будет передавать кучу данных запроса, включая ключ fb_sig_user, если он вызывается из iframe.
Поскольку вам, вероятно, нужно все равно проверять и использовать эти данные в своем приложении, используйте его, чтобы определить подходящий контекст для рендеринга.
Другой вариант - иметь очень слабо связанную схему базы данных.
//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); } }
Один из способов сделать это - создать свой собственный 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
, чтобы у вас было больше контроля над макетом и проверка каждого поля.
Ответ коттсака очень привлекателен.
Существует как минимум два механизма XForms на стороне клиента. Вот один:
У меня было то же самое нужно в недавнем проекте. Я создал класс библиотеки для этого. Я только что выпустил новую версию библиотеки.
Может быть, это может помочь вам: ASP.NET MVC Динамические формы