.NET MVC 3 Пользовательский десятичный? Модель Binder - PullRequest
8 голосов
/ 24 мая 2011

В моей модели у меня есть следующий десятичный знак?свойство:

public decimal? Budget { get; set; }

Я понимаю, что мне нужен пользовательский связыватель модели для десятичных чисел, который Хаак предоставил по следующей ссылке: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx.

Я изменил его код так, чтобы, если значение былопереданное значение содержит символ валюты и / или запятую, затем я удаляю его и затем пытаюсь преобразовать в десятичное число.Это работает, но так как мое свойство имеет нулевой десятичный тип, я также хочу, чтобы оно ничего не принимало и двигалось по своему веселому пути, вставляя ноль в этот столбец в моей базе данных.Прямо сейчас он вставляет 0,00.Я знаю, что чего-то не хватает в моем коде, но у меня зависает мозг.

Вот код связующего:

 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    object newValue = null;
    try
    {
        if (!string.IsNullOrEmpty(valueResult.AttemptedValue))
        {
            newValue = valueResult.AttemptedValue.Replace("$", "").Replace(",", "");
        }

        actualValue = Convert.ToDecimal(newValue, CultureInfo.CurrentCulture);
    }
    catch (FormatException e)
    {
        modelState.Errors.Add(e);
    }

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

Опять же, цель состоит в том, чтобы иметь десятичную дробь?Действуйте так, как обычно, но если есть значение, которое содержит символ валюты и / или запятую, и его можно преобразовать в десятичное число, чтобы вернуть его.

Спасибо

Ответы [ 2 ]

8 голосов
/ 13 октября 2011

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

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    ValueProviderResult valueResult = bindingContext.ValueProvider
        .GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    try
    {
        if(!string.IsNullOrWhiteSpace(valueResult.AttemptedValue))
            actualValue = Decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture);
    }
    catch (FormatException e)
    {
        modelState.Errors.Add(e);
    }

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    return actualValue;
}
1 голос
/ 24 мая 2011

В блоке try, я думаю, вам нужно что-то вроде

string valToCheck = valueResult.AttemptedValue;
if(valToCheck == string.Empty)
{
    actualValue = null;
}
else
{
    actualValue = Convert.ToDecimal(valToCheck.Replace("$", string.Empty), CultureInfo.InvariantCulture);
 }

В вашем коде вы всегда устанавливаете фактическое значение для результата ToDecimal ().

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