【问题标题】:Transfer Model Data in View to the Controller将视图中的模型数据传输到控制器
【发布时间】:2013-12-11 05:56:43
【问题描述】:

我有一个在我的视图中使用的模型,它充满了数据。然后在视图中编辑此数据。我需要想办法将这些数据重新提交给控制器。

这是我目前所拥有的。

查看:

@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");
        }

型号:

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。但是我无法弄清楚为什么我的模型在返回到控制器时总是为空。

【问题讨论】:

  • 您正在编辑的哪些字段没有返回?如果你想展示它,有时视图模型中会出现错误。
  • 发布您的模型也可以帮助我们确定问题。
  • 我没有得到任何字段。它只是空的。就好像来自视图的模型为空一样。情况并非如此,因为我可以在视图中很好地使用模型。 @Model.FilterSet.Genders[0] 工作正常
  • 您使用的是哪种型号? RespondentsFilterSet 或 RespondentsViewModel(控制器参数)
  • RespondentsFilterSet 抱歉忘记在控制器方法中进行编辑。

标签: c# asp.net-mvc


【解决方案1】:

看看你的表格。没有单个输入元素(提交按钮除外)。在这种情况下,您不能指望在服务器上取回任何东西。

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

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

与经典的 ASP.NET WebForms 不同,ASP.NET MVC 是无状态的。没有 ViewState 可以记住您的模型。

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

【讨论】:

  • 我检查了我的 HTML,HTML 确实有一个输入 。但它说 Qualmanager.Models.RespondentsFilterSet 作为我的价值。
  • 是的,这完全没有意义。您需要为任何模型属性提供输入字段。您不能在输入字段中存储复杂的东西,例如整个模型。但是为模型的每个属性都隐藏输入字段是完全没有意义的。这没有任何意义。只需包含一个包含模型标识符的隐藏字段。然后你的 POST 控制器操作将把这个整数标识符作为参数,并从这个模型的存储位置(数据库或其他东西)检索模型
  • 我不能简单地访问原始模型,因为用户选择了过滤器。这些过滤器在此模型中使用 javascript 和 ajax 保存。然而可能有很多过滤器,但我需要它们。因此,如果我要从数据库中重新获取这些数据,我将需要所有这些过滤器。这就是我正在弄清楚如何通过的方法。
  • 您在评论中提到了有关 AJAX 请求的一些内容,但我看不到您的问题中绝对没有与 AJAX 请求相关的代码。 AJAX 表示 javascript,在那里看不到这样的东西。您可以使用 AJAX 将值发送到服务器,但如果您希望将这些值绑定到您的 POST 控制器操作中,请确保遵守模型绑定器的命名约定。
  • 是的,页面上有一个表单,它使用一个外部 js 页面,上面有一些 ajax,它采用选定的过滤器,然后将它们保存回 Model.FilterSet。这就是用户可以选择各种过滤器的方式。这就是为什么我拼命尝试将该 Model.FilterSet 传递回我的控制器的原因。否则我会直接通过项目 id 查询数据库并完成。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多