C#中的可选参数-将用户定义的类默认为null

C#中的可选参数-将用户定义的类默认为null,c#,asp.net,C#,Asp.net,在C#控制器中,我使用一个可选参数定义了一个函数,该参数被设置为默认为null(请参见下面的代码示例)。第一次加载页面时,调用函数并将筛选器作为初始化对象传入,尽管默认值为null。我想它是空的第一次加载页面。有办法做到这一点吗 public ActionResult MyControllerFunction(CustomFilterModel filter = null) { if (filter == null) doSomething(); // We never

在C#控制器中,我使用一个可选参数定义了一个函数,该参数被设置为默认为null(请参见下面的代码示例)。第一次加载页面时,调用函数并将筛选器作为初始化对象传入,尽管默认值为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
        );
默认模型绑定器(DefaultModelBinder)将创建CustomFilterModel的实例,然后尝试用请求中的数据填充对象。即使默认模型绑定器在请求中找不到您的模型的属性,它仍然会返回空模型,因此您的参数永远不会得到null对象。源[1]中似乎没有返回空模型的内容


[1] 以下是对
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

您是用参数调用它吗?您可能没有以允许使用默认参数的方式调用它。@BradleyDotNET,TimSchemelter,这是一个MVC操作,该方法由MVC框架调用,而不是由用户代码调用。您的路由定义是什么样子的?@Thomasleveque是对的。这是一个MVC动作。因此,在加载页面时调用它。我不知道CustomFilterModel对象在哪里初始化,也不知道如何阻止它进行初始化。如果没有自定义模型绑定器,我看不到一个非常简单的方法来进行初始化。您可以接受一个字符串,检查该字符串是否为null或空,然后自己反序列化它。或者可能有一些财产必须一直存在?比如filter.Id?