私のモデルでは、LookupCategoryへのBIGINT(long/int64)の外部キー参照があります。ModelBindingをDropDownListForにInt32値で
@Html.DropDownListFor(model => model.LookupKey.LookupCategory, new SelectList(Model.LookupCategories, "ID", "Name"))
作成/編集ビューが細かい表示するが、それは文字列としてではなく、それを読んでいるので、ModelBinderを提出する項目を選択すると、「The value '1' is invalid.
を」文句を言う:次のようにビューでは、私がDropDownListForを持っています長いです。
モデルに触れることなくこれを修正する方法はありますか?私はちょうどこの小さな問題を解決するためにModelBinderを実装しないことを好むだろうが、私は、私が起草し、これを持っている必要がある場合:
public class LookupKeyBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext,
System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
if (propertyDescriptor.PropertyType == typeof(LookupKey))
{
var modelState = bindingContext.ModelState[string.Format("{0}.{1}", propertyDescriptor.Name, "LookupCategory")];
propertyDescriptor.SetValue(bindingContext.Model, long.Parse(modelState.Value.AttemptedValue));
modelState.Errors.Clear();
return;
}
}
}
私はにModelStateにアクセスしたいので、それはする必要はありませ、そのように配置されていますフォームフィールド名を知っている(ビュー間で変更可能)。だから私は適切に長い値を取得しますが、問題は、DefaultModelBinderがすでにその作業を行っていて、長い代わりに実際のLookupCategory(IDがlong値)が必要なことです。私はデータベースからLookupCategoryを見つけるためのデフォルトの動作を使用するために、デフォルトのモデルバインダーを再び使用する方法を理解できません。とにかく、これは単純なはずのようなもののためのたくさんのトリッキーです!
モデルクラスとLookupKeyクラスの詳細を追加してください。構造がソリューションに影響する可能性があるためです。 – counsellorben
あなたは何を知っていますか?あなたはそれを修正しました!私が言ったようなものではありませんでした。私はちょうどDropDownListを正しいものにしていませんでした! '@Html.DropDownListFor(model => model.LookupKey.LookupCategory ** .ID **、...')にする必要があります。答えとして入力すると、ポイントが与えられます。 –