C# 将视图中的模型数据传输到控制器

C# 将视图中的模型数据传输到控制器,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个模型,我用在我的观点,是充满数据。然后在视图中编辑此数据。我需要找到一种方法将这些数据重新提交给控制器 这是我到目前为止所拥有的 视图: 型号: public class RespondentsFilterSet : ColdListFilterSet { public List<int> OwningRecruiters { get; set; } public List<int> RecruitingGroups {

我有一个模型,我用在我的观点,是充满数据。然后在视图中编辑此数据。我需要找到一种方法将这些数据重新提交给控制器

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

视图:

型号:

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);
        }
    }
公共类响应过滤器集:ColdListFilterSet
{
公共列表所有者招聘人员{get;set;}
公共列表招聘组{get;set;}
公共覆盖bool HasAtLeastOneFilter()
{
return base.HasAtLeastOneFilter()| | | OwningRecruiters.IsNotNullOrEmpty()| | | RecruitingGroups.IsNotNullOrEmpty();
}
公共重写ExpressionBase ToExpression()
{
var expr=base.ToExpression();
var expressions=expr==null?new List():new List{expr};
if(OwningRecruiters.IsNotNullOrEmpty())
{
Add(newinexpression{Field=Create.Name(r=>r.RecruitedBy),Values=OwningRecruiters});
}
if(RecruitingGroups.IsNotNullOrEmpty())
{
expressions.Add(new-InExpression{Field=Create.Name(r=>r.creatinggroupid),Values=creatinggroups});
}
返回表达式。计数==0?null:BuildAndExpressionFromList(表达式);
}
}

我意识到我的控制器还没有最终确定。我只需要显示一些静态csv。但是我不明白为什么我的视图中的模型在返回到控制器时总是空的

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

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

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

与经典的ASP.NET WebForms相反,ASP.NET MVC是无状态的。没有ViewState来记住您的模型


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

您正在编辑的哪些字段没有返回?如果您想向显示,viewmodel中有时会出现错误。发布您的模型也可以帮助我们识别问题。我没有得到任何字段。它完全是空的。它就像来自视图的模型是空的一样。这不可能,因为我可以在视图中很好地使用模型@Model.FilterSet.Genders[0]适用于您使用的是哪种型号?RespondentsFilterSet或RespondentsViewModel(controller param)RespondentsFilterSet抱歉忘记在controller方法中编辑它。我检查了我的HTML,HTML确实有输入。但它说Qualmanager.Models.RespondentsFilterSet是我的价值观。是的,这完全没有意义。任何模型属性都需要有输入字段。不能在输入字段中存储整个模型之类的复杂内容。但是,为模型的每个属性都隐藏输入字段是完全没有意义的。这没有任何意义。只需包含一个包含模型标识符的隐藏字段。然后,您的POST controller操作将此整数标识符作为参数,并从存储此模型的任何位置(数据库或其他)检索模型。我不能简单地访问原始模型,因为用户选择了过滤器。在这个模型中,这些过滤器是使用javascript和ajax保存的。虽然可能有很多过滤器,但我需要它们全部。因此,如果我要从数据库中重新获取这些数据,我需要所有这些过滤器。这就是我想知道如何传递的内容。你在评论中提到了一些关于AJAX请求的内容,但我在你的问题中完全看不到任何与AJAX请求相关的代码。AJAX意味着javascript,在那里看不到这样的东西。您可以使用AJAX向服务器发送值,但如果希望在POST controller操作中绑定这些值,请确保遵守模型绑定器的命名约定。是的,页面上有一个表单使用外部js页面,该页面上有一些AJAX,它接受所选过滤器,然后将这些过滤器保存回服务器Model.FilterSet。这就是用户可以选择各种过滤器的方式。这就是为什么我拼命尝试将Model.FilterSet传递回我的控制器。否则,我会直接按项目id查询数据库,然后就完成了。
[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);
        }
    }