ValueProvider永远不会被调用

时间:2013-07-19 21:57:38

标签: asp.net asp.net-mvc-4 asp.net-web-api

我正在使用 MVC 4 Web API ,我有这个虚拟的ValueProvider:

DummyValueProvider.cs

class DummyValueProvider : IValueProvider
{
    public DummyValueProvider()
    {
    }

    public bool ContainsPrefix(string prefix)
    {
        return true;
    }

    public ValueProviderResult GetValue(string key)
    {
        return new ValueProviderResult("testing", "testing", System.Globalization.CultureInfo.InvariantCulture);
    }
}

class DummyValueProviderFactory : System.Web.Http.ValueProviders.ValueProviderFactory
{
    public override IValueProvider GetValueProvider(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        return new DummyValueProvider();
    }
}

对于任何要求的密钥,此ValueProvider应返回true,因此它总是在需要时为模型绑定器提供值。 ValueProvider在WebApiConfig中注册,如下所示:

WebApiConfig.cs

config.Services.Add(typeof(ValueProviderFactory), new DummyValueProviderFactory());

代码编译并运行正常。 我也在Account API控制器中执行此操作:

AccountController.cs

public HttpResponseMessage Register(string foo) { ... }

当我在下面调用它时,该动作被称为罚款:

/register?foo=bar

foo按预期填充bar;但如果我打电话:

/register

服务器返回404并显示消息No HTTP resource was found that matches the request URI 'http://localhost:14459/register'

另外,我将断点放在ContainsPrefix()和GetValue()方法中,但它们永远不会被触发。

我做错了什么? DummyValueProvider不应该为参数testing提供值foo吗?

1 个答案:

答案 0 :(得分:4)

试试这个

public HttpResponseMessage Get([ValueProvider(typeof(DummyValueProviderFactory))] string foo) {... }

我强烈建议您阅读this recent article以自定义Web Api绑定。

<强>更新
在阅读文章后,OP能够发现解决方案。这是因为它需要使用参数属性[ModelBinder]才能工作。这是因为除非参数被注释,否则假设为[FromUri]。一旦用[ModelBinder]注释,就会执行注册的处理程序。