我是ASP.Net MVC的新手。我正在尝试通过开发在线教育系统来学习MVC3。 我面临的问题是使用视图模型传递javascript从视图到控制器创建的文本框和下拉列表的值。我有一个场景,学生添加其当前资格列表。
在上图中,我试图解释我的问题。
首先,只有一行教育将在视图页面中查看。当学生点击“添加”按钮时,将在其下方添加一个新行,依此类推。
我创建了一个StudentEducation ViewModel。我还研究了类似这样的堆栈溢出的几个问题。总而言之,我发现创建了一个通用列表属性,并通过循环创建控件。但我的问题是,首先列表中没有对象,即我无法设置学生将添加的资格数。
所以请在这方面帮助我。
答案 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>