I am building a simple web application where users can vote on topics that the admins set. Each topic, can have two or more options, for example a Yes or No style vote topic, will have two options, where as a voting topic of "What is the best restaurant in Kensington?" can have many options.
Here is my current ViewModel:
public class NewTopicVM
{
[Required]
[Display(Name = "Topic Title")]
public string TopicTitle { get; set; }
[Required]
[Display(Name = "Topic Description")]
public string TopicDescription { get; set; }
[Display(Name = "Topic Image")]
public byte[] TopicImage { get; set; }
public List<NewOptionVM> TopicOptions { get; set; }
}
public class NewOptionVM
{
public string OptTitle { get; set; }
public string OptDescription { get; set; }
}
Note the list of NewOptionVM in the NewTopicVM. Thanks Iko's answer, I have managed to bind the non-dynamically generated inputs, however my dynamically generated ones are not getting bound for some reason !
Here's the jQuery code that creates the Option input fields:
var index = 1;
function generateOptMarkup() {
var container = $('<div />');
var optionInputsBlock = $('<div />');
optionInputsBlock.addClass('optionInputsBlock');
var inputTitleBlock = $('<div />');
inputTitleBlock.addClass('inputBlock');
var inputDescBlock = $('<div />');
inputDescBlock.addClass('inputBlock');
var optTitleLbl = $('<label />');
optTitleLbl.attr('for', 'TopicOptions_' + ++index + '__OptTitle');
optTitleLbl.text('Option Title');
var optDescLbl = $('<label />');
optDescLbl.attr('for', 'TopicOptions_' + index + '__OptDescription');
optDescLbl.text('Option Description');
var optTitleInpt = $('<input type="text" />');
optTitleInpt.addClass('text-box single-line');
optTitleInpt.attr('name', 'TopicOptions_' + index + '__OptTitle');
optTitleInpt.attr('id', 'TopicOptions_' + index + '__OptTitle');
optTitleInpt.attr('data-val-required', 'The Option Title field is required.');
optTitleInpt.attr('data-val', 'true');
var optDescInpt = $('<input type="text" />');
optDescInpt.addClass('text-box single-line');
optDescInpt.attr('name', 'TopicOptions_' + index + '__OptDescription');
optDescInpt.attr('id', 'TopicOptions_' + index + '__OptDescription');
optDescInpt.attr('data-val-required', 'The Option Description field is required.');
optDescInpt.attr('data-val', 'true');
inputTitleBlock.append(optTitleLbl).append(optTitleInpt);
inputDescBlock.append(optDescLbl).append(optDescInpt);
optionInputsBlock.append(inputTitleBlock).append(inputDescBlock);
container.append(optionInputsBlock);
return container.html();
}
$('div.buttons > a').click(function () {
$('div.topicOptionsBlock').append(generateOptMarkup());
});
I start at Index = 1 because I already have 2 options displayed. Here is a screenshot:

The first two boxes get bound fine, but the third one which is dynamically added after clicking the [Add Option] button does not!
What am I doing wrong? I have ensured the indexing is correct, yet it isn't working :(