2011-05-27 80 views
0

这里我将以着名的NerdDinner为例。如何让html表返回模型?

我有一个搜索页面,用户可以在其中输入搜索字符串,然后在下面的表格中查看结果。用户还可以向表中添加更多结果,如下所示:

  • 今天搜索晚餐并显示在表格中。
  • 明天搜索晚餐和结果添加到表格中。
  • 该表现在将显示今天和明天的晚餐。

用户还可以通过逐个点击它们来从表格中删除晚餐。

我需要在表格中生成pdf结果。不像打印屏幕,因为pdf有它自己的布局。我只需要表格中的数据。最好在晚餐模型列表中。

现在我可以从晚餐模型列表中生成pdf。但是,一旦我将它们印刷到桌子上并且用户操纵了它,我不知道如何将它返回到晚餐模型的列表中。

另一种解决方案可能是将Id隐藏在表中,然后在数据库中使用表中的Id进行另一次搜索(用户操作后)。至少我会以Dinners的列表的形式得到结果。但这对我来说似乎是多余的。

有没有人有类似的问题,你是如何解决它?

回答

1

你可以把表的HTML <form>内,每行除了标签,你可以有一个隐藏字段:

@model IEnumerable<Dinner> 
@using (Html.BeginForm()) 
{ 
    <table> 
     <thead> 
      <tr> 
       <th>Prop1</th> 
       <th>Prop2</th> 
       <th>Prop3</th> 
      </tr> 
     </thead> 
     <tbody> 
      @Html.EditorForModel() 
     </tbody> 
    </table> 
    <input type="submit" value="Export to PDF" /> 
} 

,并在编辑器中的模板:

@model Dinner 
<tr> 
    <td> 
     @Html.DisplayFor(x => x.Prop1) 
     @Html.HiddenFor(x => x.Prop1) 
    </td> 
    <td> 
     @Html.DisplayFor(x => x.Prop2) 
     @Html.HiddenFor(x => x.Prop2) 
    </td> 
    <td> 
     @Html.DisplayFor(x => x.Prop3) 
     @Html.HiddenFor(x => x.Prop3) 
    </td> 
</tr> 

现在此表格可提交给以下控制器操作:

public ActionResult GeneratePdf(IEnumerable<Dinner> dinners) 
{ 
    byte[] pdf = ... 
    return File(pdf, "application/pdf", "dinners.pdf"); 
} 

您还可以检出following blog post以管理变长列表,以便在添加/删除元素时为输入字段同步输入字段名称。

+0

谢谢,周末过后我会看看这个。我没有使用剃刀,但我想这不是那么大的区别? – Niklas 2011-05-28 10:31:28

+0

@Niklas,差别不大,'@'=>'<%=':-) – 2011-05-28 10:38:59

+0

从表中提交id到服务器,然后用这些id获取记录会更有效率吗?我会保存一些输出到浏览器,但我不得不再次回到数据库。这是一个管理工具,所以不会有很多同时使用的用户。你的意见? – Niklas 2011-06-01 08:39:18