このシナリオのソリューションは customIValueProvider
です。QueryString
この ASP.NET MVC 拡張ポイントは、キーを 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());
...