文字列値が int.maxvalue より大きい場合に処理するために、int をバインドするカスタム モデル バインダーを作成しました。UpdateModel を使用する多くのレガシー コードがあり、文字列値が int に変換される場合、このメソッドは例外をスローします。 int.MaxValue より大きいです。UpdateModel への呼び出しを TryUpdateModel に変更すると、更新は正常に失敗し、エラーがビューに表示されますが、より意味のあるエラー メッセージが必要なため、カスタム モデル バインダーが必要です。モデルバインダーは正常に動作しますが、次のようなアクションがあります
public ActionResult List(ListCriteria criteria, int page)
クラス ListCriteria には、次のようなプロパティがあります。
public int Page { get; set;}
私のカスタム モデル バインダーは IModelBinder を実装しています。多くのサンプルと同様に、次のように実装されています。
public class IntModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
actualValue = Convert.ToInt32(valueResult.AttemptedValue,
CultureInfo.CurrentCulture);
}
catch (FormatException e) {
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
アクションが呼び出されると、モデル バインダーは次の行で例外をスローします。
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
例外メッセージは「同じキーを持つアイテムが既に追加されています」です。これは明らかに、ListCriteria オブジェクトの Page プロパティが既にバインドされ、辞書に追加されているためです。ページ パラメータがバインドされて追加されると、例外がスローされます。
これはどのように実装する必要がありますか?オブジェクト階層の異なるレベルで同じ名前のプロパティを持つことは可能ではないでしょうか?
私の場合、Page プロパティと page パラメーターは同じ機能を実行することが判明したため、後者は削除できますが、他の場所で頭を抱える可能性があることが懸念されます...