2014-07-23 52 views
6

在C#控制器中,我有一個用默認設置爲null的可選參數定義的函數(請參閱下面的代碼示例)。第一次加載頁面時,函數被調用,並且過濾器作爲初始化對象傳入,儘管默認值爲null。首次加載頁面時,我希望它爲空。有沒有辦法做到這一點?C#中的可選參數 - 將用戶定義的類默認爲null

public ActionResult MyControllerFunction(CustomFilterModel filter = null) 
{ 
    if (filter == null) 
     doSomething(); // We never make it inside this "if" statement. 

    // Do other things... 
} 

該動作通過以下路線定義解決:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Project", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
+0

你是否用參數調用它?您可能不會以允許默認參數的方式調用它。 – BradleyDotNET

+0

@BradleyDotNET,TimSchemelter,這是一個MVC動作,該方法由MVC框架調用,而不是由用戶代碼 –

+1

你的路由定義是什麼樣的? – adam0101

回答

5

默認模型粘合劑(DefaultModelBinder)將創建CustomFilterModel的一個實例,然後嘗試填充對象從請求數據。即使默認模型聯編程序在請求中未找到模型的任何屬性,它仍會返回空模型,因此您永遠不會爲您的參數獲取空對象。在源代碼中似乎沒有任何東西會返回一個空模型。

[1] https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs

0

這裏是DefaultModelBinder替換:

public class OptionalClassInstanceBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.FallbackToEmptyPrefix = false; 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

[ModelBinder(typeof(OptionalClassInstanceBinder))] 
public class CustomFilterModel 
{ 
    ... 
} 

到位當心儘管這與粘合劑就得參數名稱前綴到任何內部特性,例如?filter.range=1而不是?range=1

相關問題