C# MVC 5 Razor for循环未渲染HiddenFor

C# MVC 5 Razor for循环未渲染HiddenFor,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我刚开始学习MVC5,我对这一点已经没有想法了。我有一个Razor视图,它不会在if语句包围的for循环中呈现@Html.HiddenFor。我还尝试删除for循环,只留下if语句,但它仍然无法渲染。如果我同时删除这两个选项,它会正确渲染 非常感谢您的帮助 以下是缩写代码——模型的SelectedFields列表填充在控制器中: 型号: public class MaintModel { public List<SourceField> SelectedFields{ get

我刚开始学习MVC5,我对这一点已经没有想法了。我有一个Razor视图,它不会在if语句包围的for循环中呈现@Html.HiddenFor。我还尝试删除for循环,只留下if语句,但它仍然无法渲染。如果我同时删除这两个选项,它会正确渲染

非常感谢您的帮助

以下是缩写代码——模型的
SelectedFields
列表填充在控制器中:

型号:

public class MaintModel
{
    public List<SourceField> SelectedFields{ get; set; }
}

public class SourceField
{       
    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private int columnOrder;
    public int ColumnOrder
    {
        get { return columnOrder; }
        set { columnOrder = value; }
    }
}
公共类MaintModel
{
公共列表所选字段{get;set;}
}
公共类源字段
{       
私有int-id;
公共整数Id
{
获取{return id;}
设置{id=value;}
}
私人秩序;
公共秩序
{
获取{return columnOrder;}
设置{columnOrder=value;}
}
}
剃刀代码:

@using TOTestMgmt
@model TOTestMgmt.Models.MaintModel

@using (Html.BeginForm("InsertDataSet", "DataSetMaint", FormMethod.Post))
{
    if (Model != null && Model.SelectedFields!= null)
    {                           
        for (int i = 0; i < Model.SelectedFields.Count; i++)
        {
           @Html.HiddenFor(model => model.InsertDataSetSelFields[i].Id, new { id = "kevtest1" })
           @Html.HiddenFor(model => model.InsertDataSetSelFields[i].ColumnOrder, new { id = "kevtest2" })
           @Html.HiddenFor(model => model.DataSetSource, new { id = "DataSetSourceHidden1" })                
        }
    }                
}
@使用TOTestMgmt
@model TOTestMgmt.Models.MaintModel
@使用(Html.BeginForm(“InsertDataSet”、“DataSetMaint”、FormMethod.Post))
{
if(Model!=null&&Model.SelectedFields!=null)
{                           
对于(int i=0;imodel.InsertDataSetSelFields[i].Id,new{Id=“kevtest1”})
@Html.HiddenFor(model=>model.InsertDataSetSelFields[i].ColumnOrder,new{id=“kevtest2”})
@Html.HiddenFor(model=>model.DataSetSource,new{id=“DataSetSourceHidden1”})
}
}                
}

@Html.HiddenFor
仅适用于当前页面模型。我是说

@model-totestmtgmt.Models.MaintModel

我还更改了生成id属性的逻辑,因为id属性在页面上必须是唯一的

    @using TOTestMgmt
    @model TOTestMgmt.Models.MaintModel

    @using (Html.BeginForm("InsertDataSet", "DataSetMaint", FormMethod.Post))
    {
        if (Model != null && Model.SelectedFields!= null)
        {                           
            for (int i = 0; i < Model.SelectedFields.Count; i++)
            {
               @Html.HiddenFor(model => Model.SelectedFields[i].Id, new { id = "kevtest" + i })
               @Html.HiddenFor(model => Model.SelectedFields[i].ColumnOrder, new { id = "kevtestColumn" + i }))                
            }
        }                
    }
@使用TOTestMgmt
@model TOTestMgmt.Models.MaintModel
@使用(Html.BeginForm(“InsertDataSet”、“DataSetMaint”、FormMethod.Post))
{
if(Model!=null&&Model.SelectedFields!=null)
{                           
对于(int i=0;imodel.SelectedFields[i].Id,new{Id=“kevtest”+i})
@Html.HiddenFor(model=>model.SelectedFields[i].ColumnOrder,new{id=“kevtestColumn”+i}))
}
}                
}

您的循环是针对集合属性
SelectedFields
,但您试图为另一个集合属性
InsertDataSetSelfFields
生成控件。由于重复的
id
属性,生成的html无效。不清楚您试图实现的目标。抱歉…InsertDataSetSelfFields应该是SelectedFields(我更改了名称以便于阅读,但忘记了这两个)。当我测试这个时,列表中只有一项,所以没有重复项——之前,我在id的末尾添加了I变量,以确保它是唯一的,但仍然不起作用。我正试图在提交表单时将我的SourceField类的集合发布到控制器。如果它真的
@Html.HiddenFor(m=>m.SelectedFields[I].Id)
,那么假设您的post方法具有参数
MaintModel model
(不要覆盖默认的
id
属性,因为
DataSetSource
不是一个集合属性,所以不要将它放在循环中)但这又有什么意义呢?为什么要向视图发送大量额外的html,然后将其原封不动地发回,从而降低性能(并让自己暴露于过度伪装的攻击中)我用Javascript有一个更好的工作方式,但有一个问题我无法解决(我将此作为一个单独的问题发布),所以我尝试学习发布集合的另一种方法--使用此链接我进行了这些更改,但它们仍然没有呈现。您能想出其他方法吗?尝试使用调试工具确定
Model!=null&&Model.SelectedFields!=null&&Model.SelectedFields.Count!=0