我在我的视图中使用for循环,它正在生成某些部分视图。这是我的部分观点:
@model Typical_MVC_Application.Controllers.testPartialModel
Test Partial
<input type="text" name="textprop" value="@Model.text" />
这里我在主视图中使用循环
@for (int i = 0; i < 5; i++)
{
@Html.Partial("TestPartial",
new Typical_MVC_Application.Controllers.testPartialModel() { textprop = "something 222" })
}
现在,如果我按照以下方式处理数据:
public ActionResult Index(List<testPartialModel> partialmodeldata /* no data is here*/)
{ }
这是我的模特:
public class testPartialModel
{
public string textprop { get; set; }
}
生成的HTML:
Test Partial <input type="text" name="textprop" value="something 222" />
Test Partial <input type="text" name="textprop" value="something 222" />
Test Partial <input type="text" name="textprop" value="something 222" />
Test Partial <input type="text" name="textprop" value="something 222" />
Test Partial <input type="text" name="textprop" value="something 222" />
我如何获取数据?我尝试了数组类型,IEnumerable
,List
,List<string>
..但没有任何效果。
答案 0 :(得分:2)
为了使for循环使用索引呈现具有正确名称的字段,必须传递实际的索引对象:
for (var i = 0; i < Model.Foos.Count(); i++)
{
@Html.EditorFor(m => m.Foos[i])
}
这也适用于部分。所以你必须这样做:
@Html.Partial("_Foo", Model.Foos[i])
您的问题是,您每次迭代都会创建testPartialModel
的新实例,并且基本上会抛弃上下文。 Razor无法知道索引应该是什么,甚至根本不应该有任何类型的前缀。对此有两种解决方案:
不要在视图中创建这些对象。相反,如果您尚未使用视图模型,则添加包含已初始化的testPartialInstances
的列表属性。然后,您可以简单地遍历此列表属性并使用正确索引的对象呈现上面的部分。这是首选的解决方案。您的观点不应对此类逻辑负责。
您可以通过传递自己的视图数据在技术上控制Razor将添加到partial中的字段的前缀:
@Html.Partial("_Foo", fooInstance, new ViewDataDictionary
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = string.Format("Foo[{0}]", i) }
}
然后,Razor会将此HtmlFieldPrefix
值前缀到它在partial中呈现的每个字段。但是,在你的场景中,这是一个创可贴。您应该按照选项#1中的说明改进代码。