2011-11-09 11 views
0

私のモデルでは、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を見つけるためのデフォルトの動作を使用するために、デフォルトのモデルバインダーを再び使用する方法を理解できません。とにかく、これは単純なはずのようなもののためのたくさんのトリッキーです!

+1

モデルクラスとLookupKeyクラスの詳細を追加してください。構造がソリューションに影響する可能性があるためです。 – counsellorben

+0

あなたは何を知っていますか?あなたはそれを修正しました!私が言ったようなものではありませんでした。私はちょうどDropDownListを正しいものにしていませんでした! '@Html.DropDownListFor(model => model.LookupKey.LookupCategory ** .ID **、...')にする必要があります。答えとして入力すると、ポイントが与えられます。 –

答えて

1

私が疑うように、モデルとLookupKeyクラスを調べることで問題を解決できました。私はそのような経験をいくつか持っていました。そこで、クラスを再見て、私が正しいモデルプロパティを使用していないことを示しました。

DropDownListForをmodel.LookupKey.LookupCategory.IDに変更したときに、正しいプロパティで同期化されたビオラ!

問題を発見したお祝いです。

関連する問題