2014-07-23 13 views
6

Trong bộ điều khiển C#, tôi có một hàm được định nghĩa với tham số tùy chọn được đặt thành mặc định là rỗng (xem ví dụ dưới đây). Lần đầu tiên trang tải, hàm được gọi và bộ lọc được truyền vào như một đối tượng được khởi tạo, mặc dù giá trị mặc định là null. Tôi muốn nó được null lần đầu tiên tải trang. Có cách nào để làm việc này không?Tham số tùy chọn trong C# - Mặc định một lớp do người dùng định nghĩa thành null

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

    // Do other things... 
} 

Hành động này được giải quyết bằng cách định nghĩa con đường sau:

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

Bạn đang gọi nó bằng một cuộc tranh luận? Có thể bạn không gọi nó theo cách cho phép tham số mặc định. – BradleyDotNET

+0

@BradleyDotNET, TimSchemelter, đó là một hành động MVC, phương pháp được gọi bởi khung MVC, không phải bởi mã người dùng –

+1

Định nghĩa tuyến đường của bạn trông như thế nào? – adam0101

Trả lời

5

Mô hình mặc định binder (DefaultModelBinder) sẽ tạo ra một thể hiện của CustomFilterModel và sau đó cố gắng để điền vào các đối tượng với dữ liệu từ các yêu cầu. Ngay cả khi mô hình mặc định liên kết tìm thấy không có thuộc tính của mô hình của bạn trong yêu cầu nó vẫn sẽ trả về mô hình rỗng, do đó bạn sẽ không bao giờ nhận được một đối tượng null cho tham số của bạn. Dường như không có gì trong nguồn [1] sẽ trả về một mô hình rỗng.

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

0

Đây là sự thay thế cho 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 
{ 
    ... 
} 

Cẩn thận mặc dù điều đó với các chất kết dính ở vị trí bạn có tiền tố tên tham số để bất cứ tài sản bên trong, ví dụ ?filter.range=1 thay vì ?range=1.

Các vấn đề liên quan