2012-09-18 71 views
6

這工作:如何通過一個可選參數,爲的ActionResult

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 

如果我讓cmpPhn可選:

public ActionResult Edit(int id, CompPhone? cmpPhn) 

我得到「錯誤1型 'MyProject.Models.CompPhone' 必須是一個不可爲空的值類型,以便將其用作通用類型或方法'System.Nullable'中的參數'T'。

如何使此輸入參數可選方法爲

這裏是你沒有把它可選視圖模型

public class MyViewModel : IValidatableObject 
{ 
... 
public CompPhone CmpPhnF { get; set; }  
... 
} 

調用方法

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult PhoneTest(MyViewModel vM) 
{ 
    if (ModelState.IsValid) 
    { var cmpPhn = vM.CmpPhnF; 
    return RedirectToAction("Edit", new { id = vM.AcntId, cmpPhn }); 
    } 
    ... 
} 

回答

12

,你這是它nullable。要使其可選,您需要爲參數定義一個默認值。 (它僅適用於C#4.0或以上):

public ActionResult Edit(int id, CompPhone cmpPhn = null) 

當前的代碼被指定爲Nullable,似乎CompPhone是一類不是值類型,且不能Nullable

CompPhone? cmpPhn相當於Nullable<CompPhone>其中CompPhone應該是一個struct

+0

感謝哈比卜清除可空和選裝之間的精妙之處。我更喜歡你對rablinz的回答,因爲它不需要重複該方法。是的,CompPhone是一個班級。 – Joe

+0

@Joe,rablinz的答案也是有效的,但是如果你使用的是.Net framework 4.0或者更高版本,那麼它帶有C#4.0,它有一個方法的默認參數選項。在此版本之前,您必須適應rablinz的答案 – Habib

+0

我已將調用方法添加到我的問題中。你回答瞭如何將課程帶入方法。我有一個關於如何從一個方法中傳遞一個類的跟進問題。當我調試調用方法時,id而不是cmpPhn被添加到路由值中。謝謝 – Joe

1

我哈比卜同意,你可以將這個參數nullable

要使參數可選,請定義兩個相同的方法,一個使用參數,另一個不使用。沒有的人必須使用預定義的默認值。

public ActionResult Edit(int id) 
{ 
    var vM = new MyViewModel(); 
    vM.CmpPhnF = defaultValue; 
    ... 
} 

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
}