此方案的解決方案是自定義IValueProvider
。這ASP.NET MVC擴展點是正確的地方,在這裏我們可以彌合QueryString
鍵進入Model.Property名。在與ModelBinder
相比,這將目標正是我們所需要(而不是引入後的問題的時候,連其他值提供商(FORM)無意中包含關鍵...)
有很好的教程如何引入自定義IValueProvider
:
並且有一個簡單的例子,它能夠爲模型「訂單」屬性提供值,來作爲查詢字符串「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());
...
2完全不同的答案 - 迫不及待地嘗試他們出來,並找出哪一個標誌!愛堆! –