iT邦幫忙

0

如何在View上定義一個陣列?

正在嘗試自己練習MVC的View,在實作以下時有碰到問題--

假設我從資料庫撈出條件為Edition=1Options
var Option1=Subject.FindInstances("Options").Cast<dynamic>().First(x => 1==x.Edition);

資料長的是這樣:
https://ithelp.ithome.com.tw/upload/images/20190829/20115336GalHSkrIjc.jpg

我想要在撈出的這筆資料,加入一個欄位Value,並照我定義的陣列(陣列中的數字對應到撈出來資料的Index值)給予Value值,單純For這個View使用,我應該要怎麼處理呢?

    var aStyle = new {
        give1= new[]{1},
        give2=new[]{2},
        give4=new[]{3},
        give8=new[]{4},
        give16=new[]{5,6,7,8,9,10}
    };
    

https://ithelp.ithome.com.tw/upload/images/20190829/20115336GVLrMKNWbb.jpg

2 個回答

4
舜~
iT邦高手 1 級 ‧ 2019-08-29 14:26:01
最佳解答

如果我理解的沒錯的話,您要的是這樣嗎?

var Option1=Subject
.FindInstances("Options")
.Cast<dynamic>()
.Where(x => 1==x.Edition)
.AsEnumerable() // 如果這個資料來源來自資料庫的話會需要這個,先撈取資料到記憶體後才能使用外部資料(比如說自己宣告的aStyle)
.Select(x=> new {
    Index = x.Index,
    Name = x.Name,
    Value = (aStyle.GetType().GetProperties())[x.Index>5?5:x.Index] // 透過GetProperties取得屬性陣列後就可以DIY了
})
.FirstOrDefault();
anniecat iT邦新手 3 級 ‧ 2019-08-30 16:16:58 檢舉

有另外將延伸的問題重新定義做發問

anniecat iT邦新手 3 級 ‧ 2019-08-30 16:42:35 檢舉

不知道方便請教你嗎 > <

anniecat iT邦新手 3 級 ‧ 2019-09-01 12:32:28 檢舉
1
YoChen
iT邦研究生 3 級 ‧ 2019-08-30 13:37:09

妳的問題有點複雜,我想要稍微簡化一下
目前看起來妳已經獲得了一個

Option1 // 來自名稱為Subject的Collections

Option1內容

Edition: 1,
Options: {...} // 存放了很多匿名物件的陣列,為了方便解釋,我們把Option1.Options想像成Option[]

Option[]內容 (Option1.Options內容)

{
    Index: 1,
    Name: OptionName1
},
{
    Index: 2,
    Name: OptionName2
},
{
    Index: 3,
    Name: OptionName3
}

既然知道我們要處理的是這個Option[] (Option1.Options)
那就只要針對他下手就好~

View的部分

<table>
    <tr>
        <th>Index</th>
        <th>Name</th>
        <th>Value</th>
    </tr>
    
    @{
        int[] valueArray = new int[] {1, 2, 4} // 因為我真的不知道妳的aStyle Array要對應什麼,所以我宣告一個看起來比較單純的~XDDD

        foreach (var option in Option1.Options)
        {
            <tr>
                <td>@option.Index</td>
                <td>@option.Name</td>
                <td>@valueArray[option.Index - 1]</td>
            </tr>
        }
    }
</table>

希望我沒有理解錯誤~XDDD

anniecat iT邦新手 3 級 ‧ 2019-08-30 16:29:29 檢舉

謝謝YoChen的回覆,我覺得你所分解View的部分以前的敘述是我要詢問的問題沒錯,不好意思讓你費心了!
然後,主要是希望可以有一個陣列,其值來自於Option1的欄位跟值,但多了一個Value的欄位,這個欄位要放的值是透過條件: Option1.Index=aStyle.give1 -> 給1
Option1.Index=aStyle.give2 -> 給2
Option1.Index=aStyle.give4 -> 給4
類似這樣~

YoChen iT邦研究生 3 級 ‧ 2019-08-30 17:52:45 檢舉

我覺得您可能要先從aStyle這個東西開始整理起
首先您可以先建立一個Style類別

public class Style{
    public int[] CompareValueArray{ get; set; }
    public int GiveValue{ get; set; }
}

接著把aStyle的架構建出來

List<Style> aStyle = new List<Style>()
{
    new Style {
        CompareValueArray =  new int[] { 1 },
        GiveValue = 1
    },
    new Style {
        CompareValueArray =  new int[] { 2 },
        GiveValue = 2
    },
    new Style {
        CompareValueArray =  new int[] { 3 },
        GiveValue = 4
    },
    new Style {
        CompareValueArray =  new int[] { 4 },
        GiveValue = 8
    },
    new Style {
        CompareValueArray =  new int[] { 5, 6, 7, 8, 9, 10 },
        GiveValue = 16
    }
};

最後,將他套用到View當中

<table>
    <tr>
        <th>Index</th>
        <th>Name</th>
        <th>Value</th>
    </tr>
    
    @{
        List<Style> aStyle = new List<Style>(){
            // ...(下略) --- 建議是建在Controller當中,再傳到View上,這邊是為了示範方便,所以放在View裡
        }

        foreach (var option in Option1.Options)
        {
            <tr>
                <td>@option.Index</td>
                <td>@option.Name</td>
                <td>@(aStyle.Where(style => style.CompareValueArray.Contains(option.Index)).First().GiveValue)</td>
            </tr>
        }
    }
</table>
anniecat iT邦新手 3 級 ‧ 2019-09-01 11:11:56 檢舉

謝謝YoChen,這樣的方式是可行的,謝謝你~
只是目前的目標是想要在View上定義一個陣列,其來源是來自於另外一個物件(Option1)加上自定義的陣列(aStyle)
但是真的很謝謝你的幫忙!

我要發表回答

立即登入回答