在ViewModel

时间:2018-03-16 23:09:16

标签: c# asp.net asp.net-mvc

当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参数。任何帮助将不胜感激

2 个答案:

答案 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对象。

另请注意:您没有从表单提交中获取视图模型,您需要从表单元素重建它。如果要将预填充数据发布到视图,则需要构建视图模型并对视图进行适当的分析以显示它。