2011-08-02 91 views
2

在MVC項目中,在我的控制器中,我希望獲取要在視圖中使用的數據。 可以說我想檢索一個List<string>和一個int從方法中獲取大量數據的正確方法

我的控制器的方法聲明與此類似。

void GetFooData(int id, out List<string> listData, out int aValue); 

在視圖中我使用像這樣:

List<string> data; 
int value; 
controller.GetFooData(myId, data, value); 

我不喜歡這種方式。如何在不使用數據包裝類的情況下以更漂亮的方式檢索數據?

+0

你的問題意味着你直接從視圖調用控制器...? –

+0

是的。但總的來說,只是一種從方法調用中檢索多個值的方法。 – Odys

+2

你可能應該多讀一些關於MVC是如何工作的。控制器應該返回一個ViewResult和視圖的模型數據,然後視圖訪問模型。視圖不應直接訪問控制器。 –

回答

3

儘管你沒有使用正確的MVC模式,在一般情況下,有很多的方法可以從一個方法返回多個事情。通常爲1:

  • 使用out參數(如上面一樣)
  • 返回Tuple持有多個項目
  • 定義,並返回一個包裝class在其屬性持有多個項目(這是經典的「最佳實踐」)
  • 返回dynamic和/或ExpandoObject

有可能更多,我不能TH現在的墨水...

+0

對於包裝類/響應類/值對象爲+1。 – Deleted

1

與.NET 4.0,你可以使用一個元組,雖然它沒有太大的改進。

Tuple<List<String>, int> GetFooData(int id) { 
    ... 
    return Tuple.Create(list, intVal); 
} 

var pair = controller.GetFooData(myId); 
var data = pair.Item1; 
var value = pair.Item2; 
1

您應該創建一個值對象來保存要返回的數據。我有一個程序員,他說:「參數是針對大學生和大學生的」。沒有冒犯大學生和小學生,但我傾向於同意這種觀點......我不使用參數EVER。

解決手頭的問題,最徹底的方法是這樣的:

public class FooData 
{ 
    public List<string> Strings { get; set; } 
    public int MyInt { get; set; } 
} 

public FooData GetFooData(int id) 
{ 
    var fooStrings = _stringRepository.GetFooStrings(id); 
    //or wherever you're getting your data from 

    return new FooData 
       { 
        Strings = fooStrings, 
        MyInt = id, //or whatever the int prop is supposed to be 
       }; 
} 

一個偉大的原則進行的拇指,我從鮑勃·馬丁的書,「清潔守則」據悉,是這樣的:如果有要返回的數據,將其返回。如果您有多個返回類型的日期,請將它們加載到包裝類中。它會讓你的生活更輕鬆,而下一個必須查看你的代碼的人將會花更少的時間來撓頭。

編輯:

如果你是新來的C#,我想我要補充說明的一個位。您的方法以void開頭。這意味着它不會返回任何東西。是的,有參數,但你可能已經刪除了它們。 :)而不是void,你的方法需要返回一個類型。如果你只有一種類型的數據要返回,比如List<string>,你可以說List<string> GetFooData(int id)等。在我上面的例子中,我添加了新的類/ FooData類型的方法,使它返回FooData。希望這可以幫助。如果你已經知道這一切,抱歉說明「顯而易見」。 (擺脫你的參數!)

ANOTHER編輯:

如果你試圖與ASP.NET MVC這項工作,因爲其他評論者建議,你應該這樣做了「MVC」的方式。如果您有需要數據的視圖,給它這樣的視圖模型:

public ViewResult SomeViewWithFooData(int id) 
{ 
    var fooStrings = _stringRepository.GetFooStrings(id); 
     //or wherever you're getting your data from 

    var fooData = new FooData 
        { 
         Strings = fooStrings, 
         MyInt = id, //or whatever the int prop is supposed to be 
        }; 

    return new View(fooData); 
} 

然後,你可以有一個名爲SomeViewWithFooData認爲,從System.Web.Mvc.ViewPage<FooData>繼承。在你看來,只需撥打Model即可查看你的數據。此時,Model是FooData類型。

<%=Model.MyInt %>是你的int從控制器動作傳遞給視圖。

<%=Model.Strings %>是您的字符串列表。

相關問題