当ViewModel被提交回控制器时,我一直在努力维护一个对象列表。 ViewModel很好地接收对象列表,但是当表单提交回控制器时,列表为空。控制器中提供了所有非集合属性,因此我不确定问题所在。我已经阅读了一些人从Scott Hanselman here
中引用的指南从我所看到的,每个人都通过构建ActionResult并让模型绑定器将集合映射到参数来解决这个问题:
控制器:
[HttpPost]
public ActionResult Submit(List<ConfigurationVariable> variables)
{
}
查看:
@for (int i = 0; i < Model.ConfigurationVariables.Count; i++)
{
<div class="row">
<div class="col-xs-4">
<label name="@Model.ConfigurationVariables[i].Name" value="@Model.ConfigurationVariables[i].Name" />
</div>
</div>
<div class="row">
<div class="col-xs-4">
<input type="text" class="form-control" name="@Model.ConfigurationVariables[i].Value" value="@Model.ConfigurationVariables[i].Value" />
</div>
</div>
}
我真正想要的是能够将我的ViewModel传递回控制器,包括ConfigurationVariables List:
控制器:
[HttpPost]
public ActionResult Submit(ReportViewModel report) //report.ConfigurationVariables is empty
{
}
查看:
@for (int i = 0; i < Model.ConfigurationVariables.Count; i++)
{
<div class="row">
<div class="col-xs-4">
@Html.LabelFor(model => model.ConfigurationVariables[i].Name, new { @class = "form-control" })
</div>
</div>
<div class="row">
<div class="col-xs-4">
@Html.TextBoxFor(model => model.ConfigurationVariables[i].Value, new { @class = "form-control" })
</div>
</div>
}
这将是一个复杂的形式,我不能只将每个集合放入ActionResult参数。任何帮助将不胜感激
答案 0 :(得分:0)
您需要将Name属性保存在隐藏的输入中,以便提交。标签值丢失。
@Html.HiddenFor(model => model.ConfigurationVariables[i].Name)
答案 1 :(得分:0)
好的,根据您的评论,您将无法使用mvc的表单绑定。不用担心。
取代此控制器定义:
public ActionResult Submit(List<ConfigurationVariable> variables)
使用以下两种方法之一:
public ActionResult Submit()
public ActionResult Submit(FormCollection submittedForm)
首先你可以访问Request对象,你需要调试并找到你的变量,然后你需要一些逻辑来解析它并使用提交的值。
在第二个中,表单集合将由表单中的所有INPUT元素组成。您将能够直接在对象上解析它们,而不会受到Request对象的其他属性的干扰。
在这两种情况下,您可能需要使用@ Html.TextBox,而不是TextBoxFor,并且您需要在视图中动态填充下拉列表。
我不是100%肯定Request对象,但是对于FormCollection,您需要为要提交的每个值/集合创建一个Input元素。包括文本框的隐藏输入
您的文本框需要是SelectListItem集合。那些需要一个键和一个值,当它们被提交时,你可以遍历集合并检查.Selected属性。
我会首先尝试使用FormCollection,如果这不起作用则会回退到Request对象。
另请注意:您没有从表单提交中获取视图模型,您需要从表单元素重建它。如果要将预填充数据发布到视图,则需要构建视图模型并对视图进行适当的分析以显示它。