2016-11-02 79 views
4

當爲頁面列表傳遞頁碼給我的MVC操作時,不需要提供頁碼。如果沒有選擇頁碼,則編號默認爲第一頁。
大部分文檔似乎都贊成使用空合併運算符,例如MVC ActionResult - 可爲空或可選參數

Public ActionResult Demo(int? page) 
{ 
    const int pageSize = 10 
    var model _db.Model.ToPagedList(page ?? 1, pageSize); 
    return View(model); 
} 

或類似的東西。

我想知道是否有使用默認參數的好處,例如,

Public ActionResult Demo(int page = 1) 
{ 
    const int pageSize = 10 
    var model _db.Model.ToPagedList(page, pageSize); 
    return View(model); 
} 

甚至

Public ActionResult Demo(int? page = 1) 
{ 
    const int pageSize = 10 
    var model _db.Model.ToPagedList(page.Value, pageSize); 
    return View(model); 
} 

雖然有頁面,在這種情況下可空類型似乎是多餘的。

特別是使用這些方法有什麼好處,還是僅僅是語法糖。

編輯:在第三個例子固定調零例外

+1

至於最後一個選項,我不會說多餘但錯誤 - 因爲如果他們通過'null'即'page'將等於什麼,並且您可能會從ToPagedList方法中獲得異常 –

+1

AFAIK 1)_支持可選參數之前的老方法。當邏輯比簡單的常量值更復雜時仍然需要。如果在一個被調用的函數中定義了常量值,並且您需要_propagate_ null,那麼也需要它。2)如果客戶端沒有辦法說「使用默認值」但仍然發送參數,那麼通用方法是3)如果您需要一種方法爲客戶說出「使用默認值」併發送參數。 2/3通常是等價的,但_sentinel_值如果用得太多可能會有害...... –

+1

同樣對於最後一個選項,您必須使用'page.Value',除非'.ToPagedList'碰巧使用'int?'for其第一個參數。 –

回答

1

最後一個沒有意義Public ActionResult Demo(int? page = 1)

根據您的方案,前兩個操作方法不會有任何不同,因爲參數是用於頁碼。 如果未提供參數,則人們希望在第一頁上着陸。

但是,如果您關心該值,則不希望使用可選參數。

public ActionResult UserDetails(int? id) 
{ 
    if (!id.HasValue) 
     return View("UserNotFound"); // Or return a message. 

    int userId = id.Value; 
    var user = _userService.GetUserById(userId); 
    // Do something 
} 

不能使用可選的參數在上面的場景 - FYI public ActionResult UserDetails(int id = 123)

你不想使用public ActionResult UserDetails(int id)。如果沒有提供id,它會導致崩潰。