Как привязать неизвестное количество полей ввода к моей ViewModel? - PullRequest
0 голосов
/ 02 августа 2011

Я пытаюсь создать онлайн-опрос.

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

[Multiple_Choice_Question]
int choice_number { get; set; } // The order in which the MCQ answer possibility is shown
int choice_wording { get; set; } // The MCQ answer possibility
string help_text { get; set; } // help_text if the user doesnt understand the answer possibility

Как должен выглядеть мой ViewModel, когда я не знаю, сколько вариантов ответа хочет пользователь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Используйте javascript и привязку модели JSON в MVC3, чтобы помочь вам здесь.

На стороне клиента создайте javascript-объект, соответствующий объекту на стороне сервера.

function MultipleChoiceQuestion(choice_number, choice_wording, help_text)
{
    this.ChoiceNumber = choice_number;
    this.ChoiceWording = choice_wording;
    this.HelpText = help_text;
}

Затем используйте javascript для итерации и анализа DOM, чтобы получить переменное количество ответов.

псевдо-код ...

var ListOfQuestions = [];
foreach(some dom elements)
{
    var cn = dom.choiceNumber;
    var cw = dom.choiceWording;
    var ht = dom.helpText;

    var question = new MultipleChoiceQuestion(cn, cw, ht);
    ListOfQuestions.push(question);

}

Опубликовать это с помощью ajax. Недостатком этого метода является то, что вы должны использовать ajax.

$.ajax({
   url:"/yoursite/controller/action",
   type:"POST",
   data: JSON.stringify(ListOfQuestions),
   dataType: 'json',
   contentType: 'application/json, charset=utf-8',
   success: function(data){},
   error: function(){}

});

Затем на стороне сервера у вас есть класс вопросов, который вы уже определили (имена ваших свойств должны совпадать с именами свойств на стороне клиента), и класс контейнера ...

public class QuestionContainer()
{
    public List<MultipleChoiceQuestion> Questions {get; set;
}

и ваше Действие принимает это как параметр

public ActionResult Create(QuestionContainer questions)
{

    ...
}

Фил Хаак написал статью об этом, но до выпуска привязки MVC3. Теперь легче, чем он написал.

http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

0 голосов
/ 02 августа 2011

Вы можете назначить определенный класс или префикс ID для каждого текстового поля и собрать их значения, используя javascript в одну строку, разделенную запятыми (или разделенную любым желаемым разделителем), и сохранить результат в поле Hidden, к которому вы можете получить доступ изваш контроллер.Вы можете получить количество текстовых полей, разделив значение скрытого поля на массив строк, поэтому длина массива будет равна количеству текстовых полей в вашем представлении

проверьте мой ответ на вопрос схожего вопроса здесь

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