0


0

明示的なキャストがデフォルトのモデルバインディングで機能しない

ASP.NET MVC2とEntity Frameworkを使用しています。 状況を少し単純化します。うまくいけば、混乱を招くことなく、より明確になります!

住所を作成するコントローラーアクションがあり、国はルックアップテーブルです(言い換えると、CountryクラスとAddressクラスの間には1対多の関係があります)。 わかりやすくするために、AddressクラスのフィールドはAddress.Landと呼ばれるとしましょう。 そして、ドロップダウンリストの目的のために、Country.CountryIDとCountry.Nameを取得しています。

Model vs. 入力検証。 したがって、ドロップダウンフィールド_formLand_を呼び出すと、機能するようになります。 しかし、フィールド* Land *(つまり、Addressクラスの変数と一致)を呼び出すと、次のエラーが表示されます。

_ 「タイプ 'System.String’からタイプ 'App.Country’へのパラメーター変換は、タイプコンバーターがこれらのタイプ間で変換できないため失敗しました。」 _

OK、これは理にかなっています。 文字列(CountryID)はフォームから取得され、バインダーはそれをCountryタイプに変換する方法を知りません。 そこで、コンバーターを作成しました。

namespace App {
    public partial class Country {
        public static explicit operator Country(string countryID) {
            AppEntities context = new AppEntities();
            Country country = (Country) context.GetObjectByKey(
                new EntityKey("AppEntities.Countries", "CountryID", countryID));
            return country;
        }
    }
}

FWIW、明示的と暗黙的の両方を試しました。 私はコントローラーからそれをテストしました-Country c =(Country)" fr "-それは正常に動作します。 ただし、ビューの投稿時に呼び出されることはありません。 モデルで同じ「タイプコンバーターなし」エラーが発生します。

型変換器があることをモデルバインダーに示唆する方法はありますか? ありがとう

1 Answer


2


型コンバーターは、明示的または暗黙的な変換とは異なり、さまざまな型の間で値を変換するオブジェクトです。

Country`と他の型の間で変換する TypeConverter`から継承したクラスを作成し、使用するコンバーターを指定するために `TypeConverterAttribute`をクラスに適用する必要があると思います。

using System.ComponentModel;

public class CountryConverter : TypeConverter
{
    // override CanConvertTo, CanConvertFrom, ConvertTo and ConvertFrom
    // (not sure about other methods...)
}

[TypeConverter(typeof(CountryConverter))]
public partial class Country
{

...

}