2010-10-15 61 views
1

我想在MVC中設計一個解決方案,其中一個類的字符串表示形式被傳遞給控制器​​,然後應該與所有的控制器構建一個網格在DB中屬於該類的數據。 (我使用ORM將類映射到表)。從類型的字符串表示動態生成一個特定類型的Enumerable對象

 //A method in the Model that populates the Item Property 
    foreach (MethodInfo method in sDRMethods) 
    { 
     if (method.Name.Contains(_domainTable)) 
     { 
      Items = method.Invoke(repositoryObject, null); 
      break; 
     } 
    } 

//View uses this Items property of the Model to populate the grid. 
public object Items; 

//_domainTable is the name of the table/class (in string format). 
//repositoryObject is the object that has methods to return IEnumerable<class> collection object of each type. 

我遇到的問題是我不知道如何在我的視圖中投射「Items」屬性來遍歷它並構建網格。

我曾嘗試使用「http://mvcsharp.wordpress.com/2010/02/11/building-a-data-grid-in-asp-net-mvc/」,但通用擴展方法期望知道它應該使用的特定類型。我傾向於使用MVC,但它看起來像我不能輕易地有這個工作(這是很難相信)。

+0

是否有更多的代碼沒有發佈但正在使用? – jfar 2010-10-15 12:19:12

+0

是的,但我不認爲這很重要。缺少的代碼是執行上述代碼的方法的「調用」。和這樣做的觀點: – Aaron 2010-10-18 11:25:21

+0

Switch(_domainTable){case「systemLookUpTable1」:return(IEnumerable )Model.Items; ....}我真的不喜歡這個視圖中的switch語句! – Aaron 2010-10-18 11:27:26

回答

1

我真的不喜歡你想要做的事情的聲音。爲什麼要將錶轉換爲字符串?

只有當您轉換爲字符串時,纔會呈現視圖。而且,在大多數情況下,應該留給MVC框架。

你提到的代碼使用HtmlTextWriter,這很好,因爲它會直接呈現給響應。

但是,聽起來好像您試圖通過將所有內容呈現爲字符串來重新發明輪子,而不是將其留給框架。

請注意,在MVC中,視圖只是用於呈現字符串的模板,也就是說,如果我已經理解了您,您確實需要什麼。因此,如果我已經遠程理解你正在嘗試做什麼,並且由於你的帖子不明確,所以你應該通過你的類作爲強類型模型的一部分來查看,然後寫一些基本設計邏輯進入視圖。

如果我是對的,這是不確定的,我想你誤解了MVC的工作原理。

看看如何使用視圖來渲染模型中的數據的幾個例子。該模型可以是任何類,它可以是一個IEnumerable,一個列表,無論如何,你可以在視圖中使用foreach循環來渲染出你想要的東西,你想要的東西。

從這個意義上說,MVC與在普通香草ASP.NET中編寫自定義控件有很大的不同。

0

謝謝你的回覆awrigley。

要求很簡單。我也許在我的文章中聽起來非常複雜。

在索引視圖上,我必須使用系統查找應用程序的所有表填充下拉列表。應用程序的「管理員」從下拉列表中選擇一個項目,該項目應該在網格中顯示該表格的內容,以便管理員可以使用該網格執行CRUD操作。

我想要做的是,將選定的項目(這是表的名稱)傳遞給控制器​​,然後將其傳遞給ViewModel類。這個類使用反射來調用(在我原來的問題所示的代碼),這已經得到了類似的方法存儲庫的正確的方法:

公共IEnumerable的GetAllTable1Data(){ ..... }

的我遇到的問題是,當我調用方法時,它會返回一個類型「對象」,我不能將其轉換爲任何特定的對象,因爲我不知道應該將其轉換爲的具體類型。當這個對象傳遞給視圖時,網格期望IEnumerable或IEnumerable,但我不知道這些信息。我不能做到這一點:

(IEnumerable的)method.Invoke(repositoryObject,NULL)

我得到:無法施展了IEnumerable到IEnumerable的

我(種)具有網格現在顯示,但我在那張視圖中使用switch語句:

開關(SLU_Type) { 案 「SLU_Table1」:Html.Grid((IEnumerable的)Model.Items); case「SLU_Table2」:Html.Grid((IEnumerable)Model.Items); ..... }

我不喜歡這個,感覺不對,但我找不到一個體面的方式!

我可以爲每個系統查找表部分視圖,但爲此,我必須添加大約30個部分視圖,並使用幾乎完全相同的代碼來執行操作&視圖。這似乎也不錯!

希望這可以讓你更好地理解我想達到的目標。

相關問題