MVC 2、ImodelbinderおよびValueProviderの変更
-
22-09-2019 - |
質問
私はASP.NET MVC 2に移行し、いくつかの問題に対処しようとしています。これが1つです:私は直接バインドする必要がありました 辞書 ビュー投稿の結果として。
ASP.NET MVC 1では、カスタムを使用して完全に機能しました imodelbinder :
/// <summary>
/// Bind Dictionary<int, int>
///
/// convention : <elm name="modelName_key" value="value"></elm>
/// </summary>
public class DictionaryModelBinder : IModelBinder
{
#region IModelBinder Members
/// <summary>
/// Mandatory
/// </summary>
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
IDictionary<int, int> retour = new Dictionary<int, int>();
// get the values
var values = bindingContext.ValueProvider;
// get the model name
string modelname = bindingContext.ModelName + '_';
int skip = modelname.Length;
// loop on the keys
foreach(string keyStr in values.Keys)
{
// if an element has been identified
if(keyStr.StartsWith(modelname))
{
// get that key
int key;
if(Int32.TryParse(keyStr.Substring(skip), out key))
{
int value;
if(Int32.TryParse(values[keyStr].AttemptedValue, out value))
retour.Add(key, value);
}
}
}
return retour;
}
#endregion
}
データの辞書を表示したいくつかのスマートHTMLBUILDERとペアで機能しました。
私が今出会った問題はそれです ValueProvider 辞書<>ではありませんが、名前がわかっている値を取得できるようにするのはivalueProviderです。
public interface IValueProvider
{
bool ContainsPrefix(string prefix);
ValueProviderResult GetValue(string key);
}
スマートな解析を実行できないので、これは本当にクールではありません...
質問 :
- すべてのキーを取得する別の方法はありますか?
- HTML要素のコレクションを辞書にバインドする別の方法を知っていますか
あなたの提案をありがとう
O.
解決
MVC 2ではもうこのようにできるとは思いません。
または、defaultModelbinderを拡張して、GetModelPropertiesなどの仮想メソッドの1つをオーバーライドしてから、ModelBindingContext内のモデル名を変更することもできます。もう1つのオプションは、辞書タイプにカスタムメタデータパバイダーを実装することです。モデル名も変更できます。
他のヒント
この質問は「答えられた」とマークされていますが、次のことが役立つかもしれないと思います。同じ問題があり、システムのソースコードを見ていました。web.mvc.defaultValueProvider。 RouteData、クエリ文字列、または要求フォームの提出(正確な順序で)から値を取得します。すべてのキーを収集するために(これは最初の質問で求めていることです)、次のヘルパー方法を書きました。
private static IEnumerable<string> GetKeys(ControllerContext context)
{
List<string> keys = new List<string>();
HttpRequestBase request = context.HttpContext.Request;
keys.AddRange(((IDictionary<string,
object>)context.RouteData.Values).Keys.Cast<string>());
keys.AddRange(request.QueryString.Keys.Cast<string>());
keys.AddRange(request.Form.Keys.Cast<string>());
return keys;
}
この方法を使用して、キーを列挙できます。
foreach (string key in GetKeys(controllerContext))
{
// Do something with the key value.
}
所属していません StackOverflow