iT邦幫忙

0

asp.net mvc 問題請教

最近正在學asp.net mvc,但目前有一些程式碼看不太懂,想請問各位

https://ithelp.ithome.com.tw/upload/images/20180904/20110132ADIescp2w5.jpg

這是我正常運作時的畫面,下面是我後端的部分:

public JsonResult List(int jtStartIndex=0, int jtPageSize=5, string jtSorting = null)
        {
            string[] OrderbyCondition = jtSorting.Split(new char[]{' '});
            string Ordering = string.Format("{0} {1}", OrderbyCondition[0], OrderbyCondition[1], Equals("ASC") ? "Ascending" : "Descending");
            var query = db.Categories.Select(c => new CategoriesViewModel
            {
              CategoryID=c.CategoryID,
              CategoryName=c.CategoryName,
              Description=c.Description,
              Picture=c.Picture

            });

            var RecordSet = query.OrderBy(Ordering).Skip(jtStartIndex).Take(jtPageSize);
            var result = Json(new { Result = "OK", Records = RecordSet , TotalRecordCount = query.Count() });
            //result.MaxJsonLength = int.MaxValue;
            return result;
        }

我對這個比較不了解,為什麼要這樣寫?特別是這行

string Ordering = string.Format("{0} {1}", OrderbyCondition[0], OrderbyCondition[1], Equals("ASC") ? "Ascending" : "Descending");

為什麼要寫{0} {1}且一定要空一格,若是不空一格就會出現這種錯誤
https://ithelp.ithome.com.tw/upload/images/20180904/20110132JoJd5u17hi.jpg

請問這種類型的錯誤我該如何尋找問題點?
這是我這程式的git,也還正在學習怎麼使用,這段程式我們老師雖然有錄影講解,但還是
有些不懂,還請各位為我講解一下,謝謝。
https://github.com/Jarkwoof/Jquery.git

marlin12 iT邦新手 1 級 ‧ 2018-09-04 23:41:31 檢舉
好像打錯字了,應該是
string Ordering = string.Format("{0} {1}", OrderbyCondition[0], OrderbyCondition[1].Equals("ASC") ? "Ascending" : "Descending");
tenno081 iT邦新手 4 級 ‧ 2018-09-05 08:44:39 檢舉
阿,抱歉是我看錯,我明天試試看
1
jacky19918
iT邦新手 5 級 ‧ 2018-09-05 09:57:35
最佳解答

你是問這邊嗎?

string[] OrderbyCondition = jtSorting.Split(new char[]{' '});
string Ordering = string.Format("{0} {1}", OrderbyCondition[0], OrderbyCondition[1], Equals("ASC") ? "Ascending" : "Descending");

這兩行會等於

var OrderbyCondition = jtSorting.Split(' ');
string Ordering = $"{OrderbyCondition[0]} {OrderbyCondition[1]}";
//也等於
//string Ordering = OrderbyCondition[0]+ " " + OrderbyCondition[1];

邏輯一樣,他後面那個Equals("ASC") ? "Ascending" : "Descending"完全沒作用,因為沒有{2},應該是原本的人改程式忘了拿掉,他原本應該是要另外做正反排序的判斷(這邊的邏輯是他只要切割後的前兩個string,後面的通通拿掉)。
那段程式應該只是在用IQueryable選擇column做排序而已,當然還是要看完整程式比較準,我只是就我目前看到的說明,Skip就是要跳過幾個,Take就是要拿多少數量的資料,通常是做分頁會做的事

tenno081 iT邦新手 4 級 ‧ 2018-09-05 11:21:42 檢舉

感謝,您補充的寫法我現在才知道,原來我們老師在電腦上就是這樣寫我這個是講義上的內容,萬分感謝,那再請問這句話的意思是?

var result = Json(new { Result = "OK", Records = RecordSet , TotalRecordCount = query.Count() });

我大概知道裡面的意思,只是我不知道裡面要寫多少個屬性,
我查了一下它的定義,裡面也寫得很簡單,就只寫建立 System.Web.Mvc.JsonResult 物件,這部分我可以去哪裡參考?

那只是為了回傳一個Json吧!?
你是問RecordSet?
RecordSet會有點像是CategoriesViewModel的List(但又不是List class,不過他在Json內應該都是屬於array)
至於你想問RecordSet內的詳細資料是什麼,那你可能要去你的db找
反正return的值應該會長得像這樣

{
    Result: "OK",
    Records: [
        {
        CategoryID: ???,
        CategoryName: ???,
        Description: ???,
        Picture: ???
        },{
        CategoryID: ???,
        CategoryName: ???,
        Description: ???,
        Picture: ???
        },...
    ],
    TotalRecordCount: ???
}
1
小魚
iT邦大師 1 級 ‧ 2018-09-04 19:46:57

string.Format 是 (好像)VS2015之後出現的語法,
如果你學過C++跟printf蠻像的,
不過全部當作字串來處理,

string.Format("{0} {1}", a, b);
就是把a跟b變數帶入0跟1當中,
這種寫法跟 a + " " + b 的結果是一樣的,
只是比較精簡也比較容易看,
(給人看的不是給機器看的,兩種寫法對機器而言都一樣)
不過string.Format會幫你自動轉換成string,
後面的參數甚至可以帶int和各式各樣的類別(只是出來的結果可能不是你要的).

之所以會出錯是因為語法當中 "Ascending" 和 "Descending" 之前一定要有空格,
字串本身不會出錯,
(字串就是你給它什麼它就接受什麼)
出錯的是你後面的動作.

tenno081 iT邦新手 4 級 ‧ 2018-09-05 08:49:05 檢舉

感謝,那第一句Split方法能詳細說明一下嗎?我知道他是將陣列裡的字元分割出來,只是不太懂為什麼要這麼做

小魚 iT邦大師 1 級 ‧ 2018-09-05 12:01:57 檢舉

對齁, Equals好像是沒有作用的, 多了一個逗號...
會不會是像 marlin12 大大說的那樣,
這你執步執行看看再去判斷吧,
也許根本不需要這一段,

另外Split是把字串切成字串的陣列,
照你的例子來看就是用空白來切,

"id ASC"

變成

{"id", "ASC"}

OrderbyCondition[0] 讀到的是"id"
OrderbyCondition[1] 讀到的是"ASC"

另外語法的部份先Google再來問吧...

tenno081 iT邦新手 4 級 ‧ 2018-09-05 20:22:46 檢舉

啊!我大概懂了這與法為何這樣用了,感謝

1
Homura
iT邦高手 1 級 ‧ 2018-09-05 11:20:33

我比較好奇的是這段

Equals("ASC") ? "Ascending" : "Descending"

你這樣寫Equals("ASC")永遠都是false
因為這樣Equals比較對象是this
就是你當下執行的Class

看更多先前的回應...收起先前的回應...

這是真的,我也很好奇為什麼會這樣寫/images/emoticon/emoticon06.gif

tenno081 iT邦新手 4 級 ‧ 2018-09-05 15:25:56 檢舉

啊,我在想會這樣做是不是因為我前端有這段:

defaultSorting: 'CategoryID ASC',

然後我下中斷觀察OrderbyCondition時,就顯示:
https://ithelp.ithome.com.tw/upload/images/20180905/201101320nbeifqYl3.jpg

[0]是欄位,[1]就判斷是否ASC,我想應該是這樣。

我們前端有用到Jtable這個套件。

然後這個說法沒錯的話我總算有些知道老師的寫法了。

/images/emoticon/emoticon06.gif

Homura iT邦高手 1 級 ‧ 2018-09-05 15:37:08 檢舉

tenno081
所以你要改成 marlin12說的那樣
OrderbyCondition[1].Equals("ASC")
才會判斷是否為ASC@@

tenno081 iT邦新手 4 級 ‧ 2018-09-05 20:01:07 檢舉

喔喔,我看懂了,我明天試看看,感謝

我要發表回答

立即登入回答