2

このようなモデルがあります。

public class QuickQuote
{
    [Required]
    public Enumerations.AUSTRALIA_STATES  state { get; set; }

    [Required]
    public Enumerations.FAMILY_TYPE familyType { get; set; }

ご覧のとおり、2 つのプロパティは列挙型です。

ここで、私は自分のモデル バインダーを使用したいと考えています。

ので、私は持っています;

public class QuickQuoteBinder : DefaultModelBinder
{

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        quickQuote = new QuickQuote();

        try
        {
            quickQuote.state = (Enumerations.AUSTRALIA_STATES)
                Enum.Parse(typeof(Enumerations.AUSTRALIA_STATES),
                bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".state").AttemptedValue);
        }
        catch {
            ModelState modelState = new ModelState();
            ModelError err = new ModelError("Required");
            modelState.Errors.Add(err);
            bindingContext.ModelState.Add(bindingContext.ModelName + ".state", modelState);
        }

問題は、プロパティごとにヒープがあり、try catch ブロック全体を実行する必要があることです。

私ができると思ったのは、ブロック全体を実行する拡張メソッドを作成することであり、渡す必要があるのはモデル プロパティと列挙だけです。

だから私は次のようなことができます。

quickQuote.state = bindingContext.ValueProvider.GetModelValue("state", ...)

これは可能ですか?

4

2 に答える 2

1

はい、拡張メソッドを使用できます。これは、どのように記述するかを示す非常に簡単な例です。

public static class Extensions
{
    public static ValueProviderResult GetModel(this IValueProvider valueProvider, string key)
    {
        return valueProvider.GetValue(key);

    }
}

他に考えられるのは、try catch ブロックではなく Enum.IsDefined を使用することです。これによりパフォーマンスが向上し、おそらくより読みやすいコードになります。

于 2010-04-16T05:04:13.053 に答える
0

わかりました。

public static class TryGetValueHelper
{
    public static TEnum TryGetValue<TEnum>(this ModelBindingContext context, string property)
    {
        try
        {
            TEnum propertyValue = (TEnum)Enum.Parse(typeof(TEnum), context.ValueProvider.GetValue(property).AttemptedValue);
            return propertyValue;
        }
        catch {
            ModelState modelState = new ModelState();
            ModelError modelError = new ModelError("Required");
            modelState.Errors.Add(modelError);
            context.ModelState.Add(context.ModelName + "." + property, modelState);
        }

        return default(TEnum);

    }
}
于 2010-04-16T04:56:44.890 に答える