MVC3对C#可选参数做了什么?

时间:2011-08-30 14:33:43

标签: c# asp.net-mvc-3

设置以下控制器

public class HomeController : Controller
{
    // GET: /Home/Read    
    public string Read(Sample sample = null)
    {
        if (sample != null)
            Console.WriteLine("Not null");
        else
            Console.WriteLine("null");

        return "";
    }

}
public class Sample
{

}

示例不为空。这是一个错误还是一个功能?

2 个答案:

答案 0 :(得分:5)

可选参数通过呼叫站点重写实现。由于控制器将由MVC引擎使用完整参数列表调用,因此可选参数根本不相关。

例如,给定以下功能:

public void Foo(int bar = 1, int baz = 2)
{
}

这样称呼它:

Foo();

使编译器实际将其解释为:

Foo(1, 2);

没有任何魔法可以使调用保持为Foo(),然后方法本身会在运行时包含在参数中。这些参数在编译时进行了分析,不需要做任何事情。

更新:要向MVC指示给定路由参数是可选的,您可以在定义路由时将其设置为UrlParameter.Optional。此时,操作方法的默认参数值应该启动。

答案 1 :(得分:1)

它的功能不是bug。绑定器看到方法签名是唯一有意义的方法(如果你定义一个没有参数我想象会被调用,或者你会得到'模糊调用'错误)并创建一个空实例,因为没有查询字符串参数可用。由于它的模型绑定器在创建实例而不是编译器,所以它是MVC正在做的。