2017-08-15 28 views
0

我正在寫一個函數來隨機選擇JSON提要中的3篇文章。我創建了一個函數,它可以在給定的兩個端點之間生成一個隨機數,並且我有一個循環迭代3次,以將文章內容輸出到頁面上。如何將整數數組傳遞給Razor函數?

隨機數函數運行成功,for循環不會輸出文章信息到頁面。 randomNumber函數需要運行3次才能獲得3個隨機數,我需要確保一旦randomNumber1被選中,就不能再次被選中。所以我創建了一個數組(featuredStories)來存儲選取的數字,但無法將其傳遞到我的getRandomNumber函數中。

@{ 
    Random rnd = new Random(); 
    var featuredStories = new List<int>(); 
} 


@functions { 
    public int getRandomNumber(int min, int max, Random rnd, int[] featuredStories) { 

    int randomNumber = rnd.Next(min, max); 

    if (featuredStories.Contains(randomNumber)){ 
     randomNumber = getRandomNumber(min, max, rnd); 
    }else{ 
     featuredStories.Add(randomNumber); 
    } 


    return randomNumber; 
} 


@for(var i = 1; i < 4; i++) { 

    int randomNo = getRandomNumber(1, items.Count(), rnd, featuredStories); 
} 

我目前得到一個錯誤:

剃刀語法錯誤。無重載方法「getRandomNumber的」 3個參數

+0

微軟做過的最糟糕的事情(是曾經)是允許剃刀功能。 Razor是一種視圖綁定語言,它不應該包含邏輯。將邏輯移入控制器並構建視圖模型。那麼你沒有這個問題,你的代碼可以更好地分離問題。 – Liam

+0

@Liam你能解釋一下如何將這段代碼移動到Controller中去除這個問題?另外,ASPX比Razor功能差得多。 –

+0

你會得到一個編譯錯誤,告訴你問題是什麼。儘管我的主要例外是MVC,但微軟已經被劫持了。視圖不應該包含邏輯,函數是邏輯的。設計模式說這是錯誤的。 T''D遵循MVC的實際規則,你的代碼會更容易理解/維護,並且你會得到更少的錯誤 – Liam

回答

1

您的代碼實際上是兩個錯誤:

@functions { 
    public int getRandomNumber(int min, int max, Random rnd, (2) int[] featuredStories) { 

    int randomNumber = rnd.Next(min, max); 

    if (featuredStories.Contains(randomNumber)){ 
     randomNumber = getRandomNumber(min, max, rnd); (1) 
    }else{ 
     featuredStories.Add(randomNumber); 
    } 


    return randomNumber; 
} 
  1. 第一個錯誤是,你是不是在遞歸調用傳遞featuredStories
  2. 第二個錯誤是int[](這是Array<int>的快捷方式)沒有Add方法,並且您還在頁面頂部將featuredStories定義爲List<int>

因此,要解決這些,你的方法改成這樣:

@functions { 
    public int getRandomNumber(int min, int max, Random rnd, List<int> featuredStories) { 

    int randomNumber = rnd.Next(min, max); 

    if (featuredStories.Contains(randomNumber)) 
    { 
     randomNumber = getRandomNumber(min, max, rnd, featuredStories); 
    } 
    else 
    { 
     featuredStories.Add(randomNumber); 
    } 


    return randomNumber; 
} 
+0

謝謝卡米洛。一旦你指出一個數組不能添加額外的項目,我已經將類型更改爲List。一切都在工作。再次感謝。 –

+0

@JamesHowell數組可以有額外的項目,但是沒有簡單的方法(你可以根據instatiation定義長度)。當你知道這個長度時,使用Array,如果你不知道,使用List –

2

你已經爲你的函數爲:

public int getRandomNumber(int min, int max, Random rnd, int[] featuredStories) { 

這4個參數

但隨後該函數內部,它只有3個參數來調用自身:

randomNumber = getRandomNumber(min, max, rnd); 

C#找不到有3個參數,因此錯誤的getRandomNumber功能的另一種定義。

仔細想想你期待這段代碼是做什麼的。對我來說,這是沒有意義的,因爲書面代碼是自我記錄使用變量和函數的描述性名稱,閱讀它應該基本上拼出算法。當我閱讀這些代碼時,我不知道爲什麼一個產生隨機數的函數會將特色故事列表作爲參數。如果該函數被稱爲getRandomStory也許......?然後我想知道 - 什麼是故事,爲什麼生成一個隨機數有時會導致數字成爲故事,有時又不成?如果不是,那麼通過再次調用隨機數函數可以獲得什麼,而忽略故事列表?

無法解碼該代碼;你會在6個月後回來,並認爲「最好??」。如果你正在尋找更深入地任何編程語言的螺母和螺栓,這是一個很好的策略,開始時,寫出來的意見算法:

//get a random story from the known ones, but include a chance that a new random number can become a story 
//generate a random number 
//if it's in the known list, just return it 
//if not in the list, add it and return it 

爲什麼這樣做?好吧..你所有的英文生活都用英文思考,所以把英文的算法推理出來。然後把它翻譯成C#。最後,如果c#清晰明瞭,評論將基本上是多餘的,可以刪除。一些模糊的代碼可能會從保留拼寫出來的評論中受益,但是這真的是簡化代碼的候選者,因此它看起來不像代碼高爾夫拼圖*,更像是即使您沒有寫

*例如,你想維護這個嗎?

//return the first occurrence of a repeated int 
a=>{for(int p=0,q=0;;q++)while(p++<q)if(a[q]==a[p])return a[q];} 
+0

,如果這是在控制器中,它不會編譯,你不會有這個問題。 – Liam

+0

我強調我不是C#開發人員。我是一名試圖使用C#CMS的FE開發人員。要溫柔。 –

+0

我已將selectedStories更名爲selectedNumbers,因此它與隨機數生成關係更密切。我已經添加了第四個參數到函數調用,所以感謝那個指針。我現在收到錯誤'Razor語法錯誤。 'System.Array'不包含'Add'的定義,並且沒有擴展方法'Add'接受'System.Array'類型的第一個參數''。如何將項目添加到C#中的數組。我按照以下帖子進行了第一次嘗試:https://stackoverflow.com/questions/33126759/add-item-to-string-array-in-razor-view –