2011-05-27 57 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