我对Spark相当陌生,我发现很难找到简单问题的资源,而我经常可以在Razor中找到答案。尽管这两者之间有一个很好的交叉点,但我目前无法弄清楚我在这个Razor Spark翻译中做错了什么。
这种情况是,我有一个模型,上面有一个对象列表(以及一些其他属性)。我希望能够在表中显示列表,并能够在列表中编辑模型的几个属性。仔细阅读,最好的方法是设置一个编辑器模板,然后对整个列表使用Html.EditorFor。我尝试过这种方法,当我将表单发布回控制器时,我会得到一个null作为发布列表,所以我将其剥离为一组测试代码,这些代码封装了我想要做的事情(一个只读int属性,一个可编辑的复选框),并设置一个测试控制器/视图来重现问题。
控制器:
public class TestController : Controller
{
public ActionResult ListTest()
{
var model = new List<TestModel>
{
new TestModel {Id = 1, Checked = true},
new TestModel {Id = 2, Checked = true},
new TestModel {Id = 3, Checked = false}
};
return View(model);
}
[HttpPost]
public ActionResult ListTest(List<TestModel> model)
{
return View(model);
}
}
工作Razor视图:
@model IList<TestModel>
@using (Html.BeginForm("ListTest", "Test", FormMethod.Post))
{
<table style="border: 1px solid">
@Html.EditorFor(x => x)
</table>
<input type="submit" value="Clicky!" />
}
工作Razor编辑器模板:
@model TestModel
<tr>
<td>
@Html.DisplayFor(x => x.Id)
@Html.HiddenFor(x => x.Id)
</td>
<td>@Html.CheckBoxFor(x => x.Checked)</td>
</tr>
尝试的Spark视图:
<viewdata model="IList<TestModel>" />
<content name="main">
<div id="main">
<form action='' id='testform' method='post'>
<table>
<tr each="var item in Model">
${Html.EditorFor(x => item, "TestModel")}
</tr>
</table>
<input type="submit" value="Clicky!" />
</form>
</div>
</content>
尝试的Spark编辑器模板:
<viewdata model="TestModel" />
<td>
${Model.Id}
${Html.HiddenFor(x => x.Id)}
</td>
<td>${Html.CheckBoxFor(x => x.Checked)}</td>
不幸的是,每当我试图以与Razor引擎相同的方式设置Spark并将列表传递给单个对象编辑器时,我都会遇到一个错误,说类型不匹配,它需要的是单个对象而不是列表,所以我不得不在将列表传递到编辑器模板之前枚举列表,我认为这就是问题的根源。
我一直在四处寻找,但目前找不到解决方案。我想使用Spark来实现这一点,而不是在Razor中只创建这些视图,但到目前为止我还不知道如何实现。我还不清楚的一个领域是Spark内部的绑定,以及它们是否会给我所需要的东西,但如果有任何帮助,我们将不胜感激。
干杯
您在Spark视图中编写了一个foreach
循环。不要用编辑器模板编写这样的循环。你不需要他们:
<viewdata model="IList<TestModel>" />
<content name="main">
<div id="main">
<form action='' id='testform' method='post'>
<table>
${Html.EditorForModel()}
</table>
<input type="submit" value="Clicky!" />
</form>
</div>
</content>
并且在您的模板中:
<viewdata model="TestModel" />
<tr>
<td>
${Model.Id}
${Html.HiddenFor(x => x.Id)}
</td>
<td>${Html.CheckBoxFor(x => x.Checked)}</td>
</tr>