这种情况的解决方案是 custom IValueProvider
。这个 ASP.NET MVC 扩展点是正确的地方,我们可以将QueryString
键桥接到 Model.Property 名称中。与 相比ModelBinder
,这将完全针对我们需要的内容(虽然不会引入以后的问题,即使其他值提供者 (FORM) 意外包含该键......)
有很好的教程如何介绍自定义IValueProvider
:
还有一个简单的例子,它能够为模型“Order”属性提供值,作为 QueryString“o”键:
工厂
// Factory
public class MyValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext ctx)
{
return new MyValueProvider(ctx);
}
}
提供者
// Provider
class MyValueProvider : IValueProvider
{
protected HttpRequestBase Request { get; set; }
public MyValueProvider(ControllerContext ctx)
{
Request = ctx.HttpContext.Request;
}
// our custom logic to test QueryString keys, and expected prefixes
public bool ContainsPrefix(string prefix)
{
var containsSpecial =
"Order".Equals(prefix, StringComparison.OrdinalIgnoreCase)
&& Request.QueryString.AllKeys.Contains("o"
, StringComparer.InvariantCultureIgnoreCase);
return containsSpecial;
}
// Handling "Order" key
public ValueProviderResult GetValue(string key)
{
if (!ContainsPrefix(key))
{
return null;
}
var values = Request.QueryString.GetValues("o");
if (values.Any())
{
return new ValueProviderResult(values, values.First()
, CultureInfo.CurrentCulture);
}
return null;
}
}
在global.asax
我们必须注入它:
protected void Application_Start()
{
ValueProviderFactories.Factories.Add(new MyValueProviderFactory());
...