2011-09-14 60 views
1

我有簡單的asp.net頁面:轉換簡單的ASP.NET Web窗體到MVC

using System; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      rptTable.DataSource = GetDataFromDB(); 
      rptTable.DataBind(); 
     } 
    } 

    private DataTable GetDataFromDB() 
    { 
     DataTable table = new DataTable(); 
     table.Columns.Add("Id", typeof(int)); 
     table.Columns.Add("Name", typeof(string)); 

     table.Rows.Add(1, "HDD"); 
     table.Rows.Add(2, "Video"); 
     table.Rows.Add(3, "RAM"); 

     return table; 
    } 

    protected void rptTable_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     TextBox tbName = (TextBox)e.Item.FindControl("tbName"); 
     int id = Convert.ToInt32(e.CommandArgument); 
     string name = tbName.Text; 

     //Category.Save(int id, string name) 
     //Rebuild Repeater 
    } 

} 

和ASPX代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableEventValidation="false" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <table> 
     <asp:Repeater ID="rptTable" runat="server" OnItemCommand="rptTable_ItemCommand"> 
      <ItemTemplate> 
       <tr> 
        <td> 
         <%#Eval("id")%> 
        </td> 
        <td> 
         <asp:TextBox ID="tbName" runat="server" Text='<%#Eval("Name")%>'></asp:TextBox> 
        </td> 
        <td> 
         <asp:Button ID="btnSave" runat="server" Text="Save" CommandArgument='<%#Eval("id")%>' /> 
        </td> 
       </tr> 
      </ItemTemplate> 
     </asp:Repeater> 
     </table> 
    </div> 
    </form> 
</body> 
</html> 

它就像簡單的格子,你可以直接編輯數據在網格中。

如何在MVC中實現相同的邏輯? 謝謝!

+0

我需要從我的控制器中的頁面讀取數據(行,文本框) – ihorko

回答

1

要在MVC應用程序中複製asp:Repeater功能,您通常會使用帶有與模型屬性綁定的文本框的foreach循環。然而,如果你真的想要,在MVC應用程序中包含一個asp:repeater控件,但是如果它依賴回發,它不會像你期望的那樣工作。

如果它是一個簡單的只讀的控制,你可以把類似的東西在你看來如下:

<scipt runat="server"> 
    protected void Page_Load(object sender, EventArgs e) { 
     rptTable.DataSource = ViewData["yourViewDataList"]; 
     rptTable.DataBind(); 
    } 
</script> 

這裏假設你已經有了可以在其中數據綁定的ViewData的東西,所以這樣做,你'd likley需要創建一個控制器方法來構建你的DataTable,就像你在'GetDataFromDB()'中所做的一樣'

我不打算進入完整的實現,但在高層次,這就是你可以使用MVC中的控制。

+0

實際上,我已經在我的視圖上循環了綁定我的頁面,我需要從我更改的行讀取數據並按下保存按鈕 – ihorko

+1

在這種情況下,您可能可能會在每個循環迭代中包裝一個表單,該表單會提交給一個名爲「SaveRow」的操作方法。在這種方法中,您可以從已提交併適當處理的模型字段中檢索值。 – dougajmcdonald

相關問題