C# MVC 5 Razor for循环未渲染HiddenFor
我刚开始学习MVC5,我对这一点已经没有想法了。我有一个Razor视图,它不会在if语句包围的for循环中呈现@Html.HiddenFor。我还尝试删除for循环,只留下if语句,但它仍然无法渲染。如果我同时删除这两个选项,它会正确渲染 非常感谢您的帮助 以下是缩写代码——模型的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
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
。