Как проверить и опубликовать данные из динамической формы в ASP.NET MVC 2 - PullRequest
2 голосов
/ 09 мая 2011

У меня есть приложение ASP.NET MVC 2, которое меня попросили расширить.Я добавляю новую функцию на сайт, где я формирую форму оценки сотрудников, основанную на динамическом списке вопросов, полученных из нашей системы управления персоналом.У меня все работает, кроме проверки и публикации ответов на сайте.Вот некоторые подробности:

  1. Я получаю список «Вопросов» из нашей серверной системы с помощью вызова веб-службы.
  2. Каждый «Вопрос» также содержит текст для отображения.следующие параметры:
    • Тип вопроса (соответствует текстовому полю, текстовой области, списку переключателей или списку флажков)
    • Если комментарии разрешены
    • Если требуется ответ
    • Если применимо, список возможных ответов

Для создания формы я использую цикл for-each над списком вопросов.Я использую значение свойства QuestionType, чтобы определить, какое частичное представление нужно отобразить (по одному для каждого из типов).Например, если QuestionType == SingleChoice, этот частичный элемент отображает варианты выбора в виде списка переключателей.Если для вопроса разрешены комментарии, я также отображаю дополнительное поле textarea для хранения комментариев пользователя.

Как я уже говорил, визуализация формы работает нормально, но теперь мне нужно:

A,Применять, когда требуется ответ.Я использую DataAnnotations для проверки везде в решении, но поскольку я не работаю со статической моделью, я не понимаю, как я могу это сделать.

B.Опубликовать результаты обратно на сайт.Для каждого вопроса может быть текст, введенный в текстовое поле или текстовое поле, выбранное значение для списка переключателей или несколько выбранных значений для списка флажков.Кроме того, каждый вопрос может также иметь дополнительный текст, отправляемый обратно в виде комментария.

Все примеры, которые я видел при работе с динамическими «списками», касаются только публикации одного значения для каждого поля.и это всегда один и тот же тип (например, список текстовых полей).С вариантами, которые я должен поддержать, плюс необходимость отправить введенные / выбранные значения и комментарий для каждого вопроса, я в тупике.

Любые рекомендации приветствуются.

1 Ответ

1 голос
/ 09 мая 2011

Я только что закончил выполнять ту же задачу.

Я решил написать пользовательский механизм связывания для моего объекта динамической формы. Связыватель модели вытащил связку префиксных ключей формы для скрытых полей, которые содержали некоторые метаданные с разделителями по этому вопросу (например, IsRequired, QuestionType, QuestionId и т. Д.)

Я использую MVC3, но я думаю, что все это должно работать в MVC2.

Я создал ModelBinder как:

public class DynamicFormModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // Create the object to be bound to (I had a kind of form object
        // with a simple list of answer objects
        DynamicForm form = new DynamicForm(new List<Answer>());

        HttpRequestBase request = controllerContext.HttpContext.Request;

        var keys = request.Form.AllKeys.Where(k => k.StartsWith("MyFormsKeyPrefix_Meta_"));
        foreach (var key in keys)
        {
            // Loop over each question's meta data. Metadata will always be present 
            // even if the user hasn't selected an answer as it's a hidden field

            // TODO: Split the meta data and pull out IsRequired, QuestionType etc

            // TODO: Get all the posted form values for the question (these values 
            //       will come from textboxes, dropdowns, checkboxes etc)
            //       Use a prefix like: MyFormsKeyPrefix_Answer_{QuestionId}
            //       textboxes & dropdowns will only ever have one value 
            //       but checkboxes could have multiple

            // TODO: If it's a mandatory question then ensure there is at least
            //       one posted value that is not an empty string

            // If there is a validation error then add it to the model state
            bindingContext.ModelState.AddModelError(key, "Field is required");

            foreach(var answerHtmlName in answerHtmlNames)
            {
                // TODO: Loop over each posted answer and create some kind of nice
                //       Answer object which holds the QuestionId, AnswerId, AnswerOptionId 
                //       and Value etc.


                // Add the answer to the forms answers list
                form.Answers.Add(answer);
            }
        }

        return form;
    }

}

Я регистрирую ModelBinder в Global.asax, используя следующее:

ModelBinders.Binders.Add(typeof(DynamicForm), new DynamicFormModelBinder());

Итак, метод действия, который получает сообщение формы, выглядит примерно так:

public ActionResult ProcessForm(DynamicForm form) {
    if(ModelState.IsValid) 
    {
        DynamicFormService.Process(form);

        return RedirectToAction("TheHttpGetAction");
    }
    return TheHttpGetAction();
}
...