Использование модели абстрактного вида в MVC 3 - PullRequest
1 голос
/ 01 декабря 2011

У меня есть форма ввода, содержащая несколько полей ввода.Каждое поле ввода имеет ElementModel, который имеет свойства в основном для метки и значения.Поля ввода для отображения указываются в документе XML, поэтому у меня есть вид динамического представления только со списком элементов.

Проблема в том, что каждый элемент должен отображаться либо в десятичном виде, либо в процентном значении.И, конечно, если это процентное значение, пользователь должен иметь возможность ввести что-то вроде «45%», а значение в модели должно быть 0,45.

Моя первая мысль, когда я нашел этоСтатья заключалась в том, чтобы использовать класс модели абстрактного представления с абстрактным свойством для значения и определить PercentageElementModel, производный от моего базового класса ElementModel, который использует привязку пользовательской модели.К сожалению, если я использую этот абстрактный базовый класс в своем представлении, аннотации данных, сделанные в PercentageElementModel, игнорируются.

Есть ли у вас какие-либо идеи о том, как я могу решить эту проблему?Я не хочу использовать строки в моей модели представления и выполнять синтаксический анализ самостоятельно, поскольку это нарушит шаблон MVC.Есть ли другие способы достичь моей цели?

Вот несколько фрагментов кода:

public abstract class ElementModel
{
    public string ElementName { get; set; }

    public ElementType ElementType { get; set; }

    public abstract double? ElementValue { get; set; }
}

public class PercentageElementModel : ElementModel
{
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:P2}")]
    public override double? ElementValue { get; set; }
}

1 Ответ

0 голосов
/ 02 декабря 2011

Я нашел другое решение, так как моя проблема больше связана с форматированием отображения, чем с проверкой: я написал собственный ModelBinder, который проверяет строку ввода текстового поля. Если он заканчивается завершающим знаком «%», я разделю значение на 100. Вот код.

public class DoubleModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            var modelState = new ModelState { Value = valueResult };

            double? actualValue = null;
            try
            {
                // cut trailing '%'
                if (valueResult.AttemptedValue.EndsWith("%"))
                {
                    var strValue = valueResult.AttemptedValue.Substring(0, valueResult.AttemptedValue.Length - 1);
                    actualValue = double.Parse(strValue, valueResult.Culture) / 100;
                }
                else
                {
                    actualValue = Convert.ToDouble(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
                }
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }

            bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
            return actualValue;
        }
    }

Остальное происходит в самом представлении. Чтобы отобразить правильный формат, я использую простой метод ToString() со строкой формата процента, назначенной при необходимости. И если пользователь вводит числовое значение без «%», событие jQuery blur() добавит знак «%» к вводу пользователя. Прекрасно работает для меня, хотя это не лучший ответ на мой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...