2012-02-15 58 views
2

我对Spark很新,我发现很难找到一般简单问题的资源,但我经常可以在Razor中找到答案。尽管两者之间有很好的交叉,但我目前还无法弄清楚我在Razor-Spark翻译中做了什么错误。使用编辑器模板编辑列表中的值Spark View Engine

情况是,我有一个模型,其上有一些对象(和其他一些属性)。我希望能够在列表中显示列表并能够在列表中编辑模型的几个属性。仔细阅读,最好的方法是设置一个编辑器模板,然后在整个列表中使用Html.EditorFor。我试过这个,当我将表单发回控制器时,我得到一个null作为发布列表,所以我已经将它剥离为一组测试代码,它封装了我想要执行的操作(只读属性和可编辑复选框)并设置一个测试控制器/视图来重现问题。

控制器:

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!" /> 
} 

工作剃刀编辑模板:

@model TestModel 

<tr> 
    <td> 
    @Html.DisplayFor(x => x.Id) 
    @Html.HiddenFor(x => x.Id) 
    </td> 
    <td>@Html.CheckBoxFor(x => x.Checked)</td> 
</tr> 

尝试星火观点:

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

尝试星火编辑模板:

<viewdata model="TestModel" /> 

    <td> 
    ${Model.Id} 
    ${Html.HiddenFor(x => x.Id)} 
    </td> 
    <td>${Html.CheckBoxFor(x => x.Checked)}</td> 

不幸的是,我得到一个错误,每当我尝试设置星火起来以同样的方式作为剃刀发动机,只是通过列表中单个对象的编辑,他说,类型不匹配,它期望单个对象而不是列表,所以我必须枚举列表,然后将它传递给编辑器模板,我认为这是导致问题的原因。

我一直在环顾四周,但目前找不到解决方案。我希望使用Spark来完成这个任务,而不是必须在Razor中创建这些视图,但我无法弄清楚到目前为止。我还不清楚的一个领域是Spark内的绑定,以及他们是否会给我我需要的东西,但任何帮助将不胜感激。

干杯

回答

1

你在你的星火视图写了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> 
+0

试了一下,并没有工作...又试了一次,我改名以.spark后而不是.cshtml,它的工作!非常感谢,因为这一整个早晨,我的头撞墙。 – 2012-02-15 14:28:34