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

本文关键字:Engine View Spark 列表 编辑器 编辑 | 更新日期: 2023-09-27 18:24:47

我对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 View Engine中的值

您在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>