Метод расширения ValueProvider.GetValue - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть такая модель;

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

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

Как видите, два свойства являются перечислениями.

Теперь я хочу использовать свой собственный модельный переплет по причинам, в которые я сейчас не буду вмешиваться.

Итак, у меня есть;

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", ...) и т. Д.

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 16 апреля 2010

Да, вы можете иметь метод расширения. Вот очень простой пример, показывающий, как вы бы это написали.

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

    }
}

Другая вещь, которую я хотел бы рассмотреть, - это использовать Enum.IsDefined вместо блока try catch. Это улучшит производительность и, вероятно, приведет к более читабельному коду.

0 голосов
/ 16 апреля 2010

все в порядке, я понял.

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);

    }
}
...