如何将未知数量的输入字段绑定到我的ViewModel?

时间:2011-08-02 12:55:56

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3

我正在尝试创建在线调查。

我有一个视图,用户可以根据用户的意愿创建具有尽可能多的答案可能性的多选问题。每个答案可能性都应该包含代表以下属性的文本框:

[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 :(得分:0)

您可以为每个文本框指定某个类或ID前缀,并使用javascript在一个逗号分隔的字符串中收集它们的值(或者用您想要的任何分隔符分隔)并将结果保存在Hidden字段中,您可以从您的控制器访问。您可以通过将隐藏字段的值拆分为字符串数组来获取文本框的数量,因此数组的长度将是视图中文本框的数量

检查我对similer问题here

的回答

答案 1 :(得分:0)

在MVC3中使用javascript和JSON模型绑定来帮助您。

在客户端创建一个与服务器端对象匹配的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;
}

并且您的Action将此作为参数

public ActionResult Create(QuestionContainer questions)
{

    ...
}
菲尔·哈克(Phil Haack)做了一篇关于此事的文章,但是在MVC3绑定发布之前。现在比他写的更容易。

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