MVC3 Editor For Double с научной нотацией - PullRequest
8 голосов
/ 03 октября 2011

У меня есть свойство моей модели типа double. Один из моих элементов имеет значение 0,000028, но при отображении моего вида редактирования редактор для этого значения отображается как 2.8e-005.

Кроме того, что это сбивает с толку моих пользователей, оно также не проходит проверку моего регулярного выражения

    [Display(Name = "Neck Dimension")]
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Neck Dimension must be a Number")]
    [Range(0, 9999.99, ErrorMessage = "Value must be between 0 - 9,999.99")]
    [Required(ErrorMessage = "The Neck Dimension is required.")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")]
    public double? NeckDimension { get; set; }

Как мне получить это поле для отображения? У меня есть этот фрагмент кода (показанный ниже), который будет отображать десятичное число, как я хочу, но я не уверен, где его реализовать.

 var dbltest = 0.000028D;
 Console.WriteLine(String.Format("{0:F20}", dbltest).TrimEnd('0')); 

Я использую свойство NeckDimension в двух местах, и редактирую вид и вид дисплея. Вот как каждый из них отображается.

@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" })

@Html.DisplayFor(model => model.NeckHDimension)

UPDATE Очевидно, DisplayFormat не будет работать с TextBoxFor. Я попытался изменить свой @ Html.TextBoxFor на Html.EditorFor и присвоил ему класс, но это не удалось, за исключением следующего:

The model item passed into the dictionary is of type 'System.Double', but this dictionary requires a model item of type 'System.String'

Этот старый код все еще работает:

@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" })

Этот код дал исключение:

@Html.EditorFor(model => model.NeckDimension, new {@class = "formatteddecimal"})

Похоже, мои варианты - это исправить с помощью javascript или исправить с помощью шаблона редактора, но у меня нет времени исследовать и изучать 2-й вариант на данный момент.

РЕШЕНИЕ:

я создал шаблон редактора для double? следующим образом.

@model double?
@{
    var ti = ViewData.TemplateInfo;
    var displayValue = string.Empty;
    if (Model.HasValue) { 
        displayValue = String.Format("{0:F20}", @Model.Value).TrimEnd('0');
    }
    <input id="@ti.GetFullHtmlFieldId(string.Empty)" name="@ti.GetFullHtmlFieldName(string.Empty)" type="text" value="@displayValue" />
}

1 Ответ

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

Вы можете украсить свойство на вашей модели представления с атрибутом [DisplayFormat]:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")]
public double Foo { get; set; }

и теперь в ваших строго типизированных представлениях просто:

@Html.DisplayFor(x => x.Foo)

или, если это для редактирования:

@Html.EditorFor(x => x.Foo)

Другая возможность, если вы хотите применить этот формат для всех двойников в вашем приложении или для каждого контроллера, - написать пользовательский шаблон отображения / редактирования .

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