使用编辑器模板编辑列表Spark View Engine中的值

时间:2012-02-15 13:29:01

标签: c# asp.net-mvc-3 spark-view-engine

我对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内部的绑定以及它们是否可以提供我需要的内容,但是我们将非常感谢任何帮助。

干杯

1 个答案:

答案 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>