我对Spark来说相当新,而且我发现很难找到通常简单问题的资源,而我经常可以在Razor中找到答案。虽然这两者之间大部分存在良好的交叉,但我目前无法弄清楚这个Razor-Spark翻译的错误。
情况是我有一个模型,上面有一个对象列表(以及其他一些属性)。我希望能够在表格中显示列表,并能够在列表中编辑模型的几个属性。阅读,最好的方法是设置一个编辑器模板,然后在整个列表中使用Html.EditorFor。我尝试了这个,当我将表单发布回控制器时,我得到一个null作为发布列表,所以我把它剥离到一组测试代码,封装了我想做的事情(readonly 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);
}
}
工作剃刀观点:
@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内部的绑定以及它们是否可以提供我需要的内容,但是我们将非常感谢任何帮助。
干杯
答案 0 :(得分:1)
您在Spark视图中编写了一个foreach
循环。不要用编辑器模板编写这样的循环。你不需要em:
<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>