将javascript创建的控件列表的值从视图传递到asp.net mvc3中的控制器

时间:2013-07-27 08:27:09

标签: asp.net-mvc-3

我是ASP.Net MVC的新手。我正在尝试通过开发在线教育系统来学习MVC3。 我面临的问题是使用视图模型传递javascript从视图到控制器创建的文本框和下拉列表的值。我有一个场景,学生添加其当前资格列表。 enter image description here

在上图中,我试图解释我的问题。

首先,只有一行教育将在视图页面中查看。当学生点击“添加”按钮时,将在其下方添加一个新行,依此类推。

我创建了一个StudentEducation ViewModel。我还研究了类似这样的堆栈溢出的几个问题。总而言之,我发现创建了一个通用列表属性,并通过循环创建控件。但我的问题是,首先列表中没有对象,即我无法设置学生将添加的资格数。

所以请在这方面帮助我。

2 个答案:

答案 0 :(得分:0)

您基本上需要模型绑定到列表。通过JavaScript添加到表中的每个新行都必须将正确的Id设置为html输入。

一段时间我遇到了同样的问题,Phil Haack的this文章帮我解决了这个问题。

我最终生成了一个新行(虽然在我的情况下,它是一个可以多次输入的整个子表单)模板,当用户按下“添加”按钮时使用该模板。我还实现了一个JavaScript辅助函数,它计算了要插入的行的正确序列号。我不需要改变控制器中的任何东西,模型绑定只是起作用。

答案 1 :(得分:0)

假设您有一个名为StudentEducation的ViewModel 在您的帖子操作中,您需要List<StudentEducation>之类的

[HttpPost]
public Action MyAction(List<StudentEducation> students)
{
 ...
}

您还需要获取操作来获取视图。首先它将是空的,不包含任何记录

public Action MyAction()
{
   //here, initialize your 
   //List<StudentEducation> vm = new List<StudentEducation>();
   // and send it to view like
   return View(vm);
}

您还需要一个强类型视图。在您查看中,您需要迭代模型并创建列表项,如

@model IEnummerable<StudentEducation>

for(var i=0;i<@Model.count;i++)
{
   @Html.TextBoxFor(o=>o[i].PropertyName)
}

这是有趣的事情。如果生成的HTML标记类似于

,则列表将正确绑定
<input type="text" value="something" name="[1].PropertyName" />

这里name="[1].PropertyName"是最重要的事情。如果您使用此模式中的名称创建列表HTML,那么您将在表单提交时获得填充List<Studenteducatio>