将模型数据传输到控制器

时间:2013-12-10 21:24:24

标签: c# asp.net-mvc

我在我的视图中使用了一个充满数据的模型。然后在视图中编辑该数据。我需要找出一种方法将这些数据重新提交给控制器。

这是我到目前为止所拥有的。

查看:

@using (Html.BeginForm("DownloadCSV", "Respondents", FormMethod.Post))
{
    @Html.HiddenFor(m => m.FilterSet)

    <div class="btn btn-default pull-right" id="dispoCSV" onclick="$('#csvFormSubmit').click()">
        <i class="icon-file-alt"></i> Disposition Report
    </div>
    <input id="csvFormSubmit" type="submit" style="display:none;" />
}

控制器:

[HttpPost]
        public ActionResult DownloadCSV(RespondentsFilterSet model)
        {
            string csv = "Charlie, Test";
            return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "DispositionReport.csv");
        }

MODEL:

public class RespondentsFilterSet : ColdListFilterSet
    {
        public List<int> OwningRecruiters { get; set; }

        public List<int> RecruitingGroups { get; set; }

        public override bool HasAtLeastOneFilter()
        {
            return base.HasAtLeastOneFilter() || OwningRecruiters.IsNotNullOrEmpty() || RecruitingGroups.IsNotNullOrEmpty();
        }

        public override ExpressionBase ToExpression()
        {
            var expr = base.ToExpression();

            var expressions = expr == null ? new List<ExpressionBase>() : new List<ExpressionBase> { expr };

            if (OwningRecruiters.IsNotNullOrEmpty())
            {
                expressions.Add(new InExpression<int> { Field = Create.Name<Respondent>(r => r.RecruitedBy), Values = OwningRecruiters });
            }

            if (RecruitingGroups.IsNotNullOrEmpty())
            {
                expressions.Add(new InExpression<int> { Field = Create.Name<Respondent>(r => r.RecruitingGroupId), Values = RecruitingGroups });
            }

            return expressions.Count == 0 ? null : BuildAndExpressionFromList(expressions);
        }
    }

我意识到我的控制器还没有最终确定。我只是显示了一些静态csv。但我无法弄清楚为什么我的视图中的模型在返回控制器时始终为null。

1 个答案:

答案 0 :(得分:2)

看看你的表格。没有单个输入元素(提交按钮除外)。在这种情况下,您无法期望在服务器上获得任何回报。

请阅读HTML以及表单在HTML中的工作方式。在HTML表单中,您有输入字段。诸如文本字段,隐藏字段,复选框,单选按钮,... - 用户与之交互的字段等内容将提交给服务器。

你已经使你的HttpPost控制器动作采用某个模型作为参数并不意味着该参数将被初始化。在ASP.NET MVC中,您有一个默认的模型绑定器。此模型绑定器查看在提交表单时将值作为值发送到服务器的内容,并使用字段的名称绑定到相应的属性。如果表单中没有输入字段,则不会将任何内容发送到服务器。只需使用Web浏览器中内置的调试工具来检查发送到服务器的确切内容。

与传统的ASP.NET WebForms相反,ASP.NET MVC是无状态的。没有ViewState可以记住你的模型。

所有这些漫无边际的说法是,在进入ASP.NET MVC之前,首先应该先阅读更多关于HTML表单的内容,然后了解Web的无状态特性。就您的特定问题而言,假设用户不应在整个某些输入字段中修改视图中任何视图模型的值,您只需在表单中包含一个包含模型ID的隐藏字段即可。然后,此ID将作为参数发送到您的POST控制器操作,您可以使用它从存储的任何位置检索原始模型(我猜数据库或其他东西)。